Message ID | m15xppk9qg.fsf@nimmagadda.net |
---|---|
State | New |
Headers | show |
Series | qemu-ga: Fix a SIGSEGV on guest-set-time command | expand |
Reviewed-by: Konstantin Kostiuk <kkostiuk@redhat.com> On Fri, Oct 18, 2024 at 1:14 PM Sunil Nimmagadda <sunil@nimmagadda.net> wrote: > qemu-ga on a NetBSD -current VM terminates with a SIGSEGV upon receiving > 'guest-set-time' command... > > Core was generated by `qemu-ga'. > Program terminated with signal SIGSEGV, Segmentation fault. > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, > str=str@entry=0xffffff922a18) > at ../qga/commands-posix.c:88 > 88 *str[len] = '\0'; > [Current thread is 1 (process 1112)] > (gdb) bt > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, > str=str@entry=0xffffff922a18) > at ../qga/commands-posix.c:88 > #1 0x000000000cd37b60 in ga_run_command (argv=argv@entry=0xffffff922a90, > action=action@entry=0xcda34b8 "set hardware clock to system time", > errp=errp@entry=0xffffff922a70, in_str=0x0) > at ../qga/commands-posix.c:164 > #2 0x000000000cd380c4 in qmp_guest_set_time (has_time=<optimized out>, > time_ns=<optimized out>, > errp=errp@entry=0xffffff922ad0) at ../qga/commands-posix.c:304 > #3 0x000000000cd253d8 in qmp_marshal_guest_set_time (args=<optimized > out>, ret=<optimized out>, errp=0xffffff922b48) > at qga/qga-qapi-commands.c:193 > #4 0x000000000cd4e71c in qmp_dispatch (cmds=cmds@entry=0xcdf5b18 > <ga_commands>, request=request@entry=0xf3c711a4b000, > allow_oob=allow_oob@entry=false, cur_mon=cur_mon@entry=0x0) at > ../qapi/qmp-dispatch.c:220 > #5 0x000000000cd36524 in process_event (opaque=0xf3c711a79000, > obj=0xf3c711a4b000, err=0x0) at ../qga/main.c:677 > #6 0x000000000cd526f0 in json_message_process_token (lexer=lexer@entry=0xf3c711a79018, > input=0xf3c712072480, > type=type@entry=JSON_RCURLY, x=28, y=1) at > ../qobject/json-streamer.c:99 > #7 0x000000000cd93860 in json_lexer_feed_char (lexer=lexer@entry=0xf3c711a79018, > ch=125 '}', flush=flush@entry=false) > at ../qobject/json-lexer.c:313 > #8 0x000000000cd93a00 in json_lexer_feed (lexer=lexer@entry=0xf3c711a79018, > > buffer=buffer@entry=0xffffff922d10 > "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > at ../qobject/json-lexer.c:350 > #9 0x000000000cd5290c in json_message_parser_feed (parser=parser@entry=0xf3c711a79000, > > buffer=buffer@entry=0xffffff922d10 > "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > at ../qobject/json-streamer.c:121 > #10 0x000000000cd361fc in channel_event_cb (condition=<optimized out>, > data=0xf3c711a79000) at ../qga/main.c:703 > #11 0x000000000cd3710c in ga_channel_client_event (channel=<optimized > out>, condition=<optimized out>, data=0xf3c711b2d300) > at ../qga/channel-posix.c:94 > #12 0x0000f3c7120d9bec in g_main_dispatch () from > /usr/pkg/lib/libglib-2.0.so.0 > #13 0x0000f3c7120dd25c in g_main_context_iterate_unlocked.constprop () > from /usr/pkg/lib/libglib-2.0.so.0 > #14 0x0000f3c7120ddbf0 in g_main_loop_run () from > /usr/pkg/lib/libglib-2.0.so.0 > #15 0x000000000cda00d8 in run_agent_once (s=0xf3c711a79000) at > ../qga/main.c:1522 > #16 run_agent (s=0xf3c711a79000) at ../qga/main.c:1559 > #17 main (argc=<optimized out>, argv=<optimized out>) at ../qga/main.c:1671 > (gdb) > > The commandline options used on the host machine... > qemu-system-aarch64 \ > -machine type=virt,pflash0=rom \ > -m 8G \ > -cpu host \ > -smp 8 \ > -accel hvf \ > -device virtio-net-pci,netdev=unet \ > -device virtio-blk-pci,drive=hd \ > -drive file=netbsd.qcow2,if=none,id=hd \ > -netdev user,id=unet,hostfwd=tcp::2223-:22 \ > -object rng-random,filename=/dev/urandom,id=viornd0 \ > -device virtio-rng-pci,rng=viornd0 \ > -serial mon:stdio \ > -display none \ > -blockdev > node-name=rom,driver=file,filename=/opt/homebrew/Cellar/qemu/9.0.2/share/qemu/edk2-aarch64-code.fd,read-only=true > \ > -chardev socket,path=/tmp/qga_netbsd.sock,server=on,wait=off,id=qga0 \ > -device virtio-serial \ > -device virtconsole,chardev=qga0,name=org.qemu.guest_agent.0 > > This patch rectifies the operator precedence while assigning the NUL > terminator. > > Signed-off-by: Sunil Nimmagadda <sunil@nimmagadda.net> > > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index c2bd0b4..bb41fa9 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -85,7 +85,7 @@ static ssize_t ga_pipe_read_str(int fd[2], char **str) > *str = g_realloc(*str, len + n + 1); > memcpy(*str + len, buf, n); > len += n; > - *str[len] = '\0'; > + (*str)[len] = '\0'; > } > close(fd[0]); > fd[0] = -1; > >
On Fri, Oct 18, 2024 at 03:34:39PM +0530, Sunil Nimmagadda wrote: > qemu-ga on a NetBSD -current VM terminates with a SIGSEGV upon receiving > 'guest-set-time' command... > > Core was generated by `qemu-ga'. > Program terminated with signal SIGSEGV, Segmentation fault. > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, str=str@entry=0xffffff922a18) > at ../qga/commands-posix.c:88 > 88 *str[len] = '\0'; > [Current thread is 1 (process 1112)] > (gdb) bt > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, str=str@entry=0xffffff922a18) > at ../qga/commands-posix.c:88 > #1 0x000000000cd37b60 in ga_run_command (argv=argv@entry=0xffffff922a90, > action=action@entry=0xcda34b8 "set hardware clock to system time", errp=errp@entry=0xffffff922a70, in_str=0x0) > at ../qga/commands-posix.c:164 > #2 0x000000000cd380c4 in qmp_guest_set_time (has_time=<optimized out>, time_ns=<optimized out>, > errp=errp@entry=0xffffff922ad0) at ../qga/commands-posix.c:304 > #3 0x000000000cd253d8 in qmp_marshal_guest_set_time (args=<optimized out>, ret=<optimized out>, errp=0xffffff922b48) > at qga/qga-qapi-commands.c:193 > #4 0x000000000cd4e71c in qmp_dispatch (cmds=cmds@entry=0xcdf5b18 <ga_commands>, request=request@entry=0xf3c711a4b000, > allow_oob=allow_oob@entry=false, cur_mon=cur_mon@entry=0x0) at ../qapi/qmp-dispatch.c:220 > #5 0x000000000cd36524 in process_event (opaque=0xf3c711a79000, obj=0xf3c711a4b000, err=0x0) at ../qga/main.c:677 > #6 0x000000000cd526f0 in json_message_process_token (lexer=lexer@entry=0xf3c711a79018, input=0xf3c712072480, > type=type@entry=JSON_RCURLY, x=28, y=1) at ../qobject/json-streamer.c:99 > #7 0x000000000cd93860 in json_lexer_feed_char (lexer=lexer@entry=0xf3c711a79018, ch=125 '}', flush=flush@entry=false) > at ../qobject/json-lexer.c:313 > #8 0x000000000cd93a00 in json_lexer_feed (lexer=lexer@entry=0xf3c711a79018, > buffer=buffer@entry=0xffffff922d10 "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > at ../qobject/json-lexer.c:350 > #9 0x000000000cd5290c in json_message_parser_feed (parser=parser@entry=0xf3c711a79000, > buffer=buffer@entry=0xffffff922d10 "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > at ../qobject/json-streamer.c:121 > #10 0x000000000cd361fc in channel_event_cb (condition=<optimized out>, data=0xf3c711a79000) at ../qga/main.c:703 > #11 0x000000000cd3710c in ga_channel_client_event (channel=<optimized out>, condition=<optimized out>, data=0xf3c711b2d300) > at ../qga/channel-posix.c:94 > #12 0x0000f3c7120d9bec in g_main_dispatch () from /usr/pkg/lib/libglib-2.0.so.0 > #13 0x0000f3c7120dd25c in g_main_context_iterate_unlocked.constprop () from /usr/pkg/lib/libglib-2.0.so.0 > #14 0x0000f3c7120ddbf0 in g_main_loop_run () from /usr/pkg/lib/libglib-2.0.so.0 > #15 0x000000000cda00d8 in run_agent_once (s=0xf3c711a79000) at ../qga/main.c:1522 > #16 run_agent (s=0xf3c711a79000) at ../qga/main.c:1559 > #17 main (argc=<optimized out>, argv=<optimized out>) at ../qga/main.c:1671 > (gdb) > > The commandline options used on the host machine... > qemu-system-aarch64 \ > -machine type=virt,pflash0=rom \ > -m 8G \ > -cpu host \ > -smp 8 \ > -accel hvf \ > -device virtio-net-pci,netdev=unet \ > -device virtio-blk-pci,drive=hd \ > -drive file=netbsd.qcow2,if=none,id=hd \ > -netdev user,id=unet,hostfwd=tcp::2223-:22 \ > -object rng-random,filename=/dev/urandom,id=viornd0 \ > -device virtio-rng-pci,rng=viornd0 \ > -serial mon:stdio \ > -display none \ > -blockdev node-name=rom,driver=file,filename=/opt/homebrew/Cellar/qemu/9.0.2/share/qemu/edk2-aarch64-code.fd,read-only=true \ > -chardev socket,path=/tmp/qga_netbsd.sock,server=on,wait=off,id=qga0 \ > -device virtio-serial \ > -device virtconsole,chardev=qga0,name=org.qemu.guest_agent.0 This bug isn't platform specific AFAICT, and will also hit other commands. Was introduced by: commit c3f32c13a325f1ca9a0b08c19fefe9e5cc04289d Author: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> Date: Wed Mar 20 18:16:43 2024 +0200 qga: introduce ga_run_command() helper for guest cmd execution and then affects multiple commands: qga/commands-posix: qmp_guest_set_user_password: use ga_run_command helper qga/commands-posix: execute_fsfreeze_hook: use ga_run_command helper qga/commands-posix: qmp_guest_set_time: use ga_run_command helper qga/commands-posix: qmp_guest_shutdown: use ga_run_command helper IOW, this is a regression in the 9.1.0 release > > This patch rectifies the operator precedence while assigning the NUL > terminator. > > Signed-off-by: Sunil Nimmagadda <sunil@nimmagadda.net> > > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > index c2bd0b4..bb41fa9 100644 > --- a/qga/commands-posix.c > +++ b/qga/commands-posix.c > @@ -85,7 +85,7 @@ static ssize_t ga_pipe_read_str(int fd[2], char **str) > *str = g_realloc(*str, len + n + 1); > memcpy(*str + len, buf, n); > len += n; > - *str[len] = '\0'; > + (*str)[len] = '\0'; > } > close(fd[0]); > fd[0] = -1; Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> With regards, Daniel
Hi Sunil, I updated the commit message according to Daniel's comment and got this patch to merge. Best Regards, Konstantin Kostiuk. On Mon, Oct 21, 2024 at 11:26 AM Daniel P. Berrangé <berrange@redhat.com> wrote: > On Fri, Oct 18, 2024 at 03:34:39PM +0530, Sunil Nimmagadda wrote: > > qemu-ga on a NetBSD -current VM terminates with a SIGSEGV upon receiving > > 'guest-set-time' command... > > > > Core was generated by `qemu-ga'. > > Program terminated with signal SIGSEGV, Segmentation fault. > > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, > str=str@entry=0xffffff922a18) > > at ../qga/commands-posix.c:88 > > 88 *str[len] = '\0'; > > [Current thread is 1 (process 1112)] > > (gdb) bt > > #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, > str=str@entry=0xffffff922a18) > > at ../qga/commands-posix.c:88 > > #1 0x000000000cd37b60 in ga_run_command (argv=argv@entry=0xffffff922a90, > > > action=action@entry=0xcda34b8 "set hardware clock to system time", > errp=errp@entry=0xffffff922a70, in_str=0x0) > > at ../qga/commands-posix.c:164 > > #2 0x000000000cd380c4 in qmp_guest_set_time (has_time=<optimized out>, > time_ns=<optimized out>, > > errp=errp@entry=0xffffff922ad0) at ../qga/commands-posix.c:304 > > #3 0x000000000cd253d8 in qmp_marshal_guest_set_time (args=<optimized > out>, ret=<optimized out>, errp=0xffffff922b48) > > at qga/qga-qapi-commands.c:193 > > #4 0x000000000cd4e71c in qmp_dispatch (cmds=cmds@entry=0xcdf5b18 > <ga_commands>, request=request@entry=0xf3c711a4b000, > > allow_oob=allow_oob@entry=false, cur_mon=cur_mon@entry=0x0) at > ../qapi/qmp-dispatch.c:220 > > #5 0x000000000cd36524 in process_event (opaque=0xf3c711a79000, > obj=0xf3c711a4b000, err=0x0) at ../qga/main.c:677 > > #6 0x000000000cd526f0 in json_message_process_token (lexer=lexer@entry=0xf3c711a79018, > input=0xf3c712072480, > > type=type@entry=JSON_RCURLY, x=28, y=1) at > ../qobject/json-streamer.c:99 > > #7 0x000000000cd93860 in json_lexer_feed_char (lexer=lexer@entry=0xf3c711a79018, > ch=125 '}', flush=flush@entry=false) > > at ../qobject/json-lexer.c:313 > > #8 0x000000000cd93a00 in json_lexer_feed (lexer=lexer@entry=0xf3c711a79018, > > > buffer=buffer@entry=0xffffff922d10 > "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > > at ../qobject/json-lexer.c:350 > > #9 0x000000000cd5290c in json_message_parser_feed (parser=parser@entry=0xf3c711a79000, > > > buffer=buffer@entry=0xffffff922d10 > "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) > > at ../qobject/json-streamer.c:121 > > #10 0x000000000cd361fc in channel_event_cb (condition=<optimized out>, > data=0xf3c711a79000) at ../qga/main.c:703 > > #11 0x000000000cd3710c in ga_channel_client_event (channel=<optimized > out>, condition=<optimized out>, data=0xf3c711b2d300) > > at ../qga/channel-posix.c:94 > > #12 0x0000f3c7120d9bec in g_main_dispatch () from > /usr/pkg/lib/libglib-2.0.so.0 > > #13 0x0000f3c7120dd25c in g_main_context_iterate_unlocked.constprop () > from /usr/pkg/lib/libglib-2.0.so.0 > > #14 0x0000f3c7120ddbf0 in g_main_loop_run () from > /usr/pkg/lib/libglib-2.0.so.0 > > #15 0x000000000cda00d8 in run_agent_once (s=0xf3c711a79000) at > ../qga/main.c:1522 > > #16 run_agent (s=0xf3c711a79000) at ../qga/main.c:1559 > > #17 main (argc=<optimized out>, argv=<optimized out>) at > ../qga/main.c:1671 > > (gdb) > > > > The commandline options used on the host machine... > > qemu-system-aarch64 \ > > -machine type=virt,pflash0=rom \ > > -m 8G \ > > -cpu host \ > > -smp 8 \ > > -accel hvf \ > > -device virtio-net-pci,netdev=unet \ > > -device virtio-blk-pci,drive=hd \ > > -drive file=netbsd.qcow2,if=none,id=hd \ > > -netdev user,id=unet,hostfwd=tcp::2223-:22 \ > > -object rng-random,filename=/dev/urandom,id=viornd0 \ > > -device virtio-rng-pci,rng=viornd0 \ > > -serial mon:stdio \ > > -display none \ > > -blockdev > node-name=rom,driver=file,filename=/opt/homebrew/Cellar/qemu/9.0.2/share/qemu/edk2-aarch64-code.fd,read-only=true > \ > > -chardev socket,path=/tmp/qga_netbsd.sock,server=on,wait=off,id=qga0 \ > > -device virtio-serial \ > > -device virtconsole,chardev=qga0,name=org.qemu.guest_agent.0 > > This bug isn't platform specific AFAICT, and will also hit > other commands. > > Was introduced by: > > commit c3f32c13a325f1ca9a0b08c19fefe9e5cc04289d > Author: Andrey Drobyshev <andrey.drobyshev@virtuozzo.com> > Date: Wed Mar 20 18:16:43 2024 +0200 > > qga: introduce ga_run_command() helper for guest cmd execution > > and then affects multiple commands: > > qga/commands-posix: qmp_guest_set_user_password: use ga_run_command > helper > qga/commands-posix: execute_fsfreeze_hook: use ga_run_command helper > qga/commands-posix: qmp_guest_set_time: use ga_run_command helper > qga/commands-posix: qmp_guest_shutdown: use ga_run_command helper > > IOW, this is a regression in the 9.1.0 release > > > > > This patch rectifies the operator precedence while assigning the NUL > > terminator. > > > > Signed-off-by: Sunil Nimmagadda <sunil@nimmagadda.net> > > > > diff --git a/qga/commands-posix.c b/qga/commands-posix.c > > index c2bd0b4..bb41fa9 100644 > > --- a/qga/commands-posix.c > > +++ b/qga/commands-posix.c > > @@ -85,7 +85,7 @@ static ssize_t ga_pipe_read_str(int fd[2], char **str) > > *str = g_realloc(*str, len + n + 1); > > memcpy(*str + len, buf, n); > > len += n; > > - *str[len] = '\0'; > > + (*str)[len] = '\0'; > > } > > close(fd[0]); > > fd[0] = -1; > > Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> > > With regards, > Daniel > -- > |: https://berrange.com -o- > https://www.flickr.com/photos/dberrange :| > |: https://libvirt.org -o- > https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- > https://www.instagram.com/dberrange :| > >
diff --git a/qga/commands-posix.c b/qga/commands-posix.c index c2bd0b4..bb41fa9 100644 --- a/qga/commands-posix.c +++ b/qga/commands-posix.c @@ -85,7 +85,7 @@ static ssize_t ga_pipe_read_str(int fd[2], char **str) *str = g_realloc(*str, len + n + 1); memcpy(*str + len, buf, n); len += n; - *str[len] = '\0'; + (*str)[len] = '\0'; } close(fd[0]); fd[0] = -1;
qemu-ga on a NetBSD -current VM terminates with a SIGSEGV upon receiving 'guest-set-time' command... Core was generated by `qemu-ga'. Program terminated with signal SIGSEGV, Segmentation fault. #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, str=str@entry=0xffffff922a18) at ../qga/commands-posix.c:88 88 *str[len] = '\0'; [Current thread is 1 (process 1112)] (gdb) bt #0 0x000000000cd37a40 in ga_pipe_read_str (fd=fd@entry=0xffffff922a20, str=str@entry=0xffffff922a18) at ../qga/commands-posix.c:88 #1 0x000000000cd37b60 in ga_run_command (argv=argv@entry=0xffffff922a90, action=action@entry=0xcda34b8 "set hardware clock to system time", errp=errp@entry=0xffffff922a70, in_str=0x0) at ../qga/commands-posix.c:164 #2 0x000000000cd380c4 in qmp_guest_set_time (has_time=<optimized out>, time_ns=<optimized out>, errp=errp@entry=0xffffff922ad0) at ../qga/commands-posix.c:304 #3 0x000000000cd253d8 in qmp_marshal_guest_set_time (args=<optimized out>, ret=<optimized out>, errp=0xffffff922b48) at qga/qga-qapi-commands.c:193 #4 0x000000000cd4e71c in qmp_dispatch (cmds=cmds@entry=0xcdf5b18 <ga_commands>, request=request@entry=0xf3c711a4b000, allow_oob=allow_oob@entry=false, cur_mon=cur_mon@entry=0x0) at ../qapi/qmp-dispatch.c:220 #5 0x000000000cd36524 in process_event (opaque=0xf3c711a79000, obj=0xf3c711a4b000, err=0x0) at ../qga/main.c:677 #6 0x000000000cd526f0 in json_message_process_token (lexer=lexer@entry=0xf3c711a79018, input=0xf3c712072480, type=type@entry=JSON_RCURLY, x=28, y=1) at ../qobject/json-streamer.c:99 #7 0x000000000cd93860 in json_lexer_feed_char (lexer=lexer@entry=0xf3c711a79018, ch=125 '}', flush=flush@entry=false) at ../qobject/json-lexer.c:313 #8 0x000000000cd93a00 in json_lexer_feed (lexer=lexer@entry=0xf3c711a79018, buffer=buffer@entry=0xffffff922d10 "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) at ../qobject/json-lexer.c:350 #9 0x000000000cd5290c in json_message_parser_feed (parser=parser@entry=0xf3c711a79000, buffer=buffer@entry=0xffffff922d10 "{\"execute\":\"guest-set-time\"}\n", size=<optimized out>) at ../qobject/json-streamer.c:121 #10 0x000000000cd361fc in channel_event_cb (condition=<optimized out>, data=0xf3c711a79000) at ../qga/main.c:703 #11 0x000000000cd3710c in ga_channel_client_event (channel=<optimized out>, condition=<optimized out>, data=0xf3c711b2d300) at ../qga/channel-posix.c:94 #12 0x0000f3c7120d9bec in g_main_dispatch () from /usr/pkg/lib/libglib-2.0.so.0 #13 0x0000f3c7120dd25c in g_main_context_iterate_unlocked.constprop () from /usr/pkg/lib/libglib-2.0.so.0 #14 0x0000f3c7120ddbf0 in g_main_loop_run () from /usr/pkg/lib/libglib-2.0.so.0 #15 0x000000000cda00d8 in run_agent_once (s=0xf3c711a79000) at ../qga/main.c:1522 #16 run_agent (s=0xf3c711a79000) at ../qga/main.c:1559 #17 main (argc=<optimized out>, argv=<optimized out>) at ../qga/main.c:1671 (gdb) The commandline options used on the host machine... qemu-system-aarch64 \ -machine type=virt,pflash0=rom \ -m 8G \ -cpu host \ -smp 8 \ -accel hvf \ -device virtio-net-pci,netdev=unet \ -device virtio-blk-pci,drive=hd \ -drive file=netbsd.qcow2,if=none,id=hd \ -netdev user,id=unet,hostfwd=tcp::2223-:22 \ -object rng-random,filename=/dev/urandom,id=viornd0 \ -device virtio-rng-pci,rng=viornd0 \ -serial mon:stdio \ -display none \ -blockdev node-name=rom,driver=file,filename=/opt/homebrew/Cellar/qemu/9.0.2/share/qemu/edk2-aarch64-code.fd,read-only=true \ -chardev socket,path=/tmp/qga_netbsd.sock,server=on,wait=off,id=qga0 \ -device virtio-serial \ -device virtconsole,chardev=qga0,name=org.qemu.guest_agent.0 This patch rectifies the operator precedence while assigning the NUL terminator. Signed-off-by: Sunil Nimmagadda <sunil@nimmagadda.net>