[prev in list] [next in list] [prev in thread] [next in thread] 

List:       libguestfs
Subject:    [Libguestfs] golang: panic: runtime error: cgo argument has Go pointer to Go pointer
From:       yuankangjian  <ykj373998035 () 163 ! com>
Date:       2020-04-29 5:56:48
Message-ID: 213f2952.49f9.171c482556d.Coremail.ykj373998035 () 163 ! com
[Download RAW message or body]

[Attachment #2 (multipart/alternative)]

[Attachment #4 (text/plain)]

Hello,
when i use libguestfs to ceph rbd by golang, but there has panic:




panic: runtime error: cgo argument has Go pointer to Go pointer


goroutine 1 [running]:
guestfs.(*Guestfs).Add_drive.func11(0xc000010028, 0xcda6a0, 0xc0000d6000, \
                0xc000090280)
/opt/gopath/src/guestfs/guestfs.go:1440 +0xc2
guestfs.(*Guestfs).Add_drive(0xc000010028, 0x7ffd4b5d67ff, 0xd, 0xc00008d9d8, 0x0)
/opt/gopath/src/guestfs/guestfs.go:1440 +0x1b2
main.OpenImage(0x7ffd4b5d67ff, 0xd, 0x0, 0x0, 0x42110b, 0x7c87e0, 0x4f41e0)
/opt/gopath/src/disk/disk.go:34 +0x371
main.resizeext4(0x7ffd4b5d67ff, 0xd, 0x0, 0x0)
/opt/gopath/src/disk/disk.go:677 +0x60
main.main()
/opt/gopath/src/disk/disk.go:970 +0x5e5


i found struct in guestfs.h
struct guestfs_add_drive_opts_argv {
...
char *const *server; 
...
}


so i make a daemon to test. has the same error.  how could i to use libguestfs to \
connect ceph rbd use golang interface.


package main


/*
#include <stdio.h>
#include <string.h>
struct t_server {
  const char *protocol;
  char *const *addr;
};


void show(struct t_server *optargs) {
        if (optargs->protocol == NULL){
                printf("protocol is  null \n");
        }
        printf("proto is %s\n", optargs->protocol);
        int num = strlen(*optargs->addr)-1;
        int i = 0;
        for(i=0;i<num;i++){
                printf("%s\n",optargs->addr[i]);
        }
}


*/
import "C"


import (
        "unsafe"
)


func main(){
c_optargs := C.struct_t_server{}
        c_optargs.protocol = C.CString("test")
        serverlist := []string{"aaa", "bbb", "ccc"}
        var buf []*C.char
        for i, _ := range serverlist {
            buf = append(buf, (*C.char)(unsafe.Pointer(C.CString(serverlist[i]))))
        }
        buf = append(buf, (*C.char)(unsafe.Pointer(nil)))
        c_optargs.addr = &buf[0]
        C.show(&c_optargs)
}








 


[Attachment #5 (text/html)]

<div style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div \
style="line-height:1.7;color:#000000;font-size:14px;font-family:Arial"><div \
style="margin:0;"><span style="font-family: Calibri, sans-serif; font-size: \
14.6667px;"><b>Hello,</b></span></div><div style="margin:0;"><font face="Calibri, \
sans-serif"><span style="font-size: 14.6667px;"><b>when i use libguestfs to ceph rbd \
by golang, but there has&nbsp;panic:</b></span></font></div><div \
style="margin:0;"><font face="Calibri, sans-serif"><span style="font-size: \
14.6667px;"><br></span></font></div><div style="margin:0;"><br></div><div \
style="margin:0;"><font face="Calibri, sans-serif"><div style="font-size: 14.6667px; \
margin: 0px;">panic: runtime error: cgo argument has Go pointer to Go \
pointer</div><div style="font-size: 14.6667px; margin: 0px;"><br></div><div \
style="font-size: 14.6667px; margin: 0px;">goroutine 1 [running]:</div><div \
style="font-size: 14.6667px; margin: \
0px;">guestfs.(*Guestfs).Add_drive.func11(0xc000010028, 0xcda6a0, 0xc0000d6000, \
0xc000090280)</div><div style="font-size: 14.6667px; margin: 0px;"><span \
style="white-space:pre">	</span>/opt/gopath/src/guestfs/guestfs.go:1440 \
+0xc2</div><div style="font-size: 14.6667px; margin: \
0px;">guestfs.(*Guestfs).Add_drive(0xc000010028, 0x7ffd4b5d67ff, 0xd, 0xc00008d9d8, \
0x0)</div><div style="font-size: 14.6667px; margin: 0px;"><span \
style="white-space:pre">	</span>/opt/gopath/src/guestfs/guestfs.go:1440 \
+0x1b2</div><div style="font-size: 14.6667px; margin: \
0px;">main.OpenImage(0x7ffd4b5d67ff, 0xd, 0x0, 0x0, 0x42110b, 0x7c87e0, \
0x4f41e0)</div><div style="font-size: 14.6667px; margin: 0px;"><span \
style="white-space:pre">	</span>/opt/gopath/src/disk/disk.go:34 +0x371</div><div \
style="font-size: 14.6667px; margin: 0px;">main.resizeext4(0x7ffd4b5d67ff, 0xd, 0x0, \
0x0)</div><div style="font-size: 14.6667px; margin: 0px;"><span \
style="white-space:pre">	</span>/opt/gopath/src/disk/disk.go:677 +0x60</div><div \
style="font-size: 14.6667px; margin: 0px;">main.main()</div><div style="font-size: \
14.6667px; margin: 0px;"><span style="white-space: \
pre;">	</span>/opt/gopath/src/disk/disk.go:970 +0x5e5</div><div style="font-size: \
14.6667px; margin: 0px;"><br></div><div style="font-size: 14.6667px; margin: 0px;">i \
found struct in guestfs.h</div><div style="font-size: 14.6667px; margin: 0px;"><span \
style="font-size: 14.6667px;">struct guestfs_add_drive_opts_argv {</span></div><div \
style="font-size: 14.6667px; margin: 0px;"><span style="font-size: \
14.6667px;">...</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">char *const *server;&nbsp;</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">...</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">}</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"><b>so i make a daemon to test. has the same \
error.&nbsp; how could i to use libguestfs to connect ceph rbd use golang \
interface.</b></span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"><br></span></div><div style="margin: 0px;"><div style="margin: \
0px;"><span style="font-size: 14.6667px;">package main</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">/*</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">#include \
&lt;stdio.h&gt;</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">#include &lt;string.h&gt;</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">struct t_server {</span></div><div style="margin: \
0px;"><span style="font-size: 14.6667px;">&nbsp; const char \
*protocol;</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; char *const *addr;</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">};</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"><br></span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">void show(struct t_server *optargs) {</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
if (optargs-&gt;protocol == NULL){</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \
printf("protocol is&nbsp; null \n");</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
printf("proto is %s\n", optargs-&gt;protocol);</span></div><div style="margin: \
0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; int num = \
strlen(*optargs-&gt;addr)-1;</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; int i = 0;</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
for(i=0;i&lt;num;i++){</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \
printf("%s\n",optargs-&gt;addr[i]);</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; }</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">}</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">*/</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">import "C"</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"><br></span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">import (</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
"unsafe"</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">)</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">func main(){</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"><span style="white-space:pre">		</span>c_optargs := \
C.struct_t_server{}</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; c_optargs.protocol = \
C.CString("test")</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; serverlist := []string{"aaa", "bbb", \
"ccc"}</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; var buf []*C.char</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
for i, _ := range serverlist {</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buf = \
append(buf, (*C.char)(unsafe.Pointer(C.CString(serverlist[i]))))</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; \
}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;">&nbsp; \
&nbsp; &nbsp; &nbsp; buf = append(buf, \
(*C.char)(unsafe.Pointer(nil)))</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; c_optargs.addr = \
&amp;buf[0]</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">&nbsp; &nbsp; &nbsp; &nbsp; C.show(&amp;c_optargs)</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;">}<span style="white-space: \
pre;">		</span></span></div></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"><br></span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"><br></span></div></font></div></div><br><br><span \
title="neteasefooter"><p>&nbsp;</p></span></div><br><br><span \
title="neteasefooter"><p>&nbsp;</p></span>



_______________________________________________
Libguestfs mailing list
Libguestfs@redhat.com
https://www.redhat.com/mailman/listinfo/libguestfs

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic