[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 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; </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. 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 \
<stdio.h></span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;">#include <string.h></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;"> const char \
*protocol;</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"> 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;"> \
if (optargs->protocol == NULL){</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"> \
printf("protocol is null \n");</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"> }</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"> \
printf("proto is %s\n", optargs->protocol);</span></div><div style="margin: \
0px;"><span style="font-size: 14.6667px;"> int num = \
strlen(*optargs->addr)-1;</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"> int i = 0;</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"> \
for(i=0;i<num;i++){</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"> \
printf("%s\n",optargs->addr[i]);</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;">*/</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;"> \
"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;"> c_optargs.protocol = \
C.CString("test")</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"> serverlist := []string{"aaa", "bbb", \
"ccc"}</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"> var buf []*C.char</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"> \
for i, _ := range serverlist {</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"> buf = \
append(buf, (*C.char)(unsafe.Pointer(C.CString(serverlist[i]))))</span></div><div \
style="margin: 0px;"><span style="font-size: 14.6667px;"> \
}</span></div><div style="margin: 0px;"><span style="font-size: 14.6667px;"> \
buf = append(buf, \
(*C.char)(unsafe.Pointer(nil)))</span></div><div style="margin: 0px;"><span \
style="font-size: 14.6667px;"> c_optargs.addr = \
&buf[0]</span></div><div style="margin: 0px;"><span style="font-size: \
14.6667px;"> C.show(&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> </p></span></div><br><br><span \
title="neteasefooter"><p> </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