Hi Tom,
Updated, thanks!
Best Regards
Nan Xiao
Index: dmesg.c
===================================================================
RCS file: /cvs/src/sbin/dmesg/dmesg.c,v
retrieving revision 1.29
diff -u -p -r1.29 dmesg.c
--- dmesg.c 1 Sep 2017 07:31:45 -0000 1.29
+++ dmesg.c 4 Sep 2017 13:17:01 -0000
@@ -65,12 +65,12 @@ main(int argc, char *argv[])
int ch, newl, skip, i;
char *p;
struct msgbuf cur;
- char *memf, *nlistf, *bufdata = NULL;
+ char *memf = NULL, *nlistf = NULL, *bufdata = NULL;
char *allocated = NULL;
int startupmsgs = 0;
char buf[5];
- memf = nlistf = NULL;
+ memset(&cur, 0, sizeof(cur));
while ((ch = getopt(argc, argv, "sM:N:")) != -1)
switch(ch) {
case 's':
On 9/4/2017 8:07 PM, Tom Cosgrove wrote:
>> - free(allocated);
>> + if (allocated)
>> + free(allocated);
>
> This is unnecessary, since free(NULL) is clearly defined as a no-op.
> See the malloc(3) man page.
>
> Tom
>
>>>> Nan Xiao 4-Sep-17 12:11 >>>
>>
>> Hi tech@,
>>
>> This patch fixes the extreme case in dmesg.c: if memf or nlistf is not
>> NULL, and "NOKVM" macro is defined.
>>
>> Current code in dmesg.c:
>>
>> struct msgbuf cur;
>>
>> Since "cur" is not initialized, so the following code has undefined
>> behavior:
>>
>> if (cur.msg_bufx >= cur.msg_bufs)
>> cur.msg_bufx = 0;
>> /*
>> * The message buffer is circular; start at the read pointer, and
>> * go to the write pointer - 1.
>> */
>> for (newl = skip = i = 0, p = bufdata + cur.msg_bufx;
>> i < cur.msg_bufs; i++, p++) {
>> .....
>> }
>>
>> My patch can skip the whole loop, and the "dmesg" program just prints
>> a newline:
>>
>> if (!newl)
>> putchar('\n');
>>
>> Best Regards
>> Nan Xiao
>>
>> Index: dmesg.c
>> ===================================================================
>> RCS file: /cvs/src/sbin/dmesg/dmesg.c,v
>> retrieving revision 1.29
>> diff -u -p -r1.29 dmesg.c
>> --- dmesg.c 1 Sep 2017 07:31:45 -0000 1.29
>> +++ dmesg.c 4 Sep 2017 08:55:50 -0000
>> @@ -65,12 +65,12 @@ main(int argc, char *argv[])
>> int ch, newl, skip, i;
>> char *p;
>> struct msgbuf cur;
>> - char *memf, *nlistf, *bufdata = NULL;
>> + char *memf = NULL, *nlistf = NULL, *bufdata = NULL;
>> char *allocated = NULL;
>> int startupmsgs = 0;
>> char buf[5];
>>
>> - memf = nlistf = NULL;
>> + memset(&cur, 0, sizeof(cur));
>> while ((ch = getopt(argc, argv, "sM:N:")) != -1)
>> switch(ch) {
>> case 's':
>> @@ -184,7 +184,8 @@ main(int argc, char *argv[])
>> }
>> if (!newl)
>> putchar('\n');
>> - free(allocated);
>> + if (allocated)
>> + free(allocated);
>> return (0);
>> }