* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
@ 2008-07-07 9:36 ` halesh dot s at gmail dot com
2008-07-07 18:49 ` lists at roberthogan dot net
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: halesh dot s at gmail dot com @ 2008-07-07 9:36 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From halesh dot s at gmail dot com 2008-07-07 09:35 -------
Hi Robert,
Please check the below testcase..
$cat test.c
#include <stdio.h>
int main()
{
FILE *f;
int locaddr, locport, remaddr, remport, uid, inode;
char big_str[256];
f = fopen("/proc/net/tcp", "r");
fgets(big_str,256,f);
printf("%s\n", big_str);
fgets(big_str,256,f);
printf("%s\n", big_str);
sscanf(big_str, "%*d: %8x:%4x %8x:%4x %*2x %*8x:%*8x %*2x:%*8x %*8x %d
%*d %u \n",&locaddr, (unsigned int *) &locport, &remaddr, (unsigned int *)
&remport,&uid, &inode);
printf("LocAddr:%d LocPort:%x RemAddr:%x RemPort:%x uid:%d inode:%d
\n",locaddr, locport, remaddr, remport, uid, inode);
}
$ gcc -o test test.c
$ ./test
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt
uid timeout inode
0: 0100007F:1780 00000000:0000 0A 00000000:00000000 00:00000000 00000000
504 0 5488802 1 0df2da80 3000 0 0 2 -1
LocAddr:100007f LocPort:1780 RemAddr:0 RemPort:0 uid:504 inode:5488802
Local port gets stored correctly using sscanf.
I have checked with glibc 2.3 and glibc 2.7. I was not able to reproduce.
I have checkd for all the enties in tcp file in a loop and worked fine.
Please revert back with the problem scenario if my understanding is not correct.
-Thanks,
Halesh
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
2008-07-07 9:36 ` [Bug regex/6722] " halesh dot s at gmail dot com
@ 2008-07-07 18:49 ` lists at roberthogan dot net
2008-07-07 19:19 ` schwab at suse dot de
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: lists at roberthogan dot net @ 2008-07-07 18:49 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From lists at roberthogan dot net 2008-07-07 18:48 -------
Apologies, I should have provided the full test case. This should recreate the
problem. locaddr and remaddr are 32-bit ints.
#include <stdio.h>
# include <sys/types.h>
int main()
{
FILE *f;
u_int32_t locaddr, remaddr, uid, inode = 0;
u_int16_t locport, remport;
static char big_str[151];
f = fopen("/proc/net/tcp", "r");
fgets(big_str,151,f);
while (fgets(big_str, 152, f) != NULL) {
sscanf(big_str, "%*d: %8x:%4x %8x:%4x %*2x %*8x:%*8x %*2x:
%*8x%*8x %d %*d %u \n",
&locaddr, (unsigned int *) &locport, &remaddr,
(unsigned int *) &remport,&uid, &inode);
printf("%s", big_str);
printf("%d %x %x %x %x %x\n",locaddr, locport, remaddr, remport, uid,
inode);
}
}
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
2008-07-07 9:36 ` [Bug regex/6722] " halesh dot s at gmail dot com
2008-07-07 18:49 ` lists at roberthogan dot net
@ 2008-07-07 19:19 ` schwab at suse dot de
2008-07-07 19:43 ` jakub at redhat dot com
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: schwab at suse dot de @ 2008-07-07 19:19 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From schwab at suse dot de 2008-07-07 19:19 -------
> locaddr and remaddr are 32-bit ints.
No, they are not. You are violation the strict-aliasing rules.
--
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |INVALID
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
` (2 preceding siblings ...)
2008-07-07 19:19 ` schwab at suse dot de
@ 2008-07-07 19:43 ` jakub at redhat dot com
2008-07-08 4:10 ` halesh dot s at gmail dot com
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: jakub at redhat dot com @ 2008-07-07 19:43 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From jakub at redhat dot com 2008-07-07 19:42 -------
Well, locaddr and remaddr are 32-bit ints, but locport and remport are not;
the testcase doesn't only violate aliasing rules, but with the 32-bit write
to 16-bit memory locations also clobbers unrelated memory on the stack.
Either use %8x:%4hx and kill the bogus casts, or you need to assign to
int/unsigned int temporaries and copy to the short vars afterwards.
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
` (3 preceding siblings ...)
2008-07-07 19:43 ` jakub at redhat dot com
@ 2008-07-08 4:10 ` halesh dot s at gmail dot com
2008-07-08 7:46 ` halesh dot s at gmail dot com
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: halesh dot s at gmail dot com @ 2008-07-08 4:10 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From halesh dot s at gmail dot com 2008-07-08 04:09 -------
(In reply to comment #4)
> Either use %8x:%4hx and kill the bogus casts, or you need to assign to
> int/unsigned int temporaries and copy to the short vars afterwards.
I have not changed the testcase as u mentioned, instead i exchanged the
declaration order of ports...Now its working fine..
Please check the testcase
#include <stdio.h>
#include <sys/types.h>
int main()
{
u_int32_t locaddr, remaddr, uid, inode = 0;
/* changed the order of declaration in testcase provided by robert*/
u_int16_t remport, locport;
FILE *f;
char big_str[256];
f = fopen("/proc/net/tcp", "r");
fgets(big_str,256,f);
printf("%s\n", big_str);
while(fgets(big_str,256,f) != NULL) {
printf("%s\n", big_str);
sscanf(big_str, "%*d: %8x:%4x %8x:%4x %*2x %*8x:%*8x %*2x:%*8x
%*8x %d %*d %u \n",&locaddr, (unsigned int *) &locport, &remaddr, (unsigned int
*) &remport,&uid, &inode);
printf("LocAddr:%x LocPort:%x RemAddr:%x RemPort:%x uid:%d
inode:%d\n",locaddr, locport, remaddr, remport, uid, inode);
}
}
O/P is
........
........
53: C865582B:8116 CD65582B:0016 01 00000000:00000000 02:000082E4 00000000
0 0 3258616 2 195aca80 202 40 0 2 -1
LocAddr:c865582b LocPort:8116 RemAddr:cd65582b RemPort:16 uid:0 inode:3258616
........
........
Results are fine now.
It depends upon alignment of 16 bit variables or what???
--
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at redhat dot com,
| |schwab at suse dot de
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
` (4 preceding siblings ...)
2008-07-08 4:10 ` halesh dot s at gmail dot com
@ 2008-07-08 7:46 ` halesh dot s at gmail dot com
2008-07-08 7:54 ` jakub at redhat dot com
2008-07-08 17:53 ` lists at roberthogan dot net
7 siblings, 0 replies; 9+ messages in thread
From: halesh dot s at gmail dot com @ 2008-07-08 7:46 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From halesh dot s at gmail dot com 2008-07-08 07:46 -------
(In reply to comment #4)
> Well, locaddr and remaddr are 32-bit ints, but locport and remport are not;
> the testcase doesn't only violate aliasing rules, but with the 32-bit write
> to 16-bit memory locations also clobbers unrelated memory on the stack.
> Either use %8x:%4hx and kill the bogus casts, or you need to assign to
> int/unsigned int temporaries and copy to the short vars afterwards.
>
We can avoide cloberring of 16 bit hex vairables by using %hx, How to avoide
the same when using u_int8_t variables.
We cant use %hx for u_int8_t as its only upto short int - 16 bits.
Please check the below testcase
#include <stdio.h>
#include <sys/types.h>
int main()
{
int cur = 123;
u_int8_t var1;
u_int8_t var2;
scanf("%x", &var1);
scanf("%x", &var2);
printf("var1 = %x\n", var1);
printf("var2 = %x\n", var2);
printf("cur = %d\n", cur);
}
O/P is...
1
2
var1 = 0 **
var2 = 2
cur = 0 **
How to avoide the clobbering while using of 8 bit hex??
Any idea abt this??
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
` (5 preceding siblings ...)
2008-07-08 7:46 ` halesh dot s at gmail dot com
@ 2008-07-08 7:54 ` jakub at redhat dot com
2008-07-08 17:53 ` lists at roberthogan dot net
7 siblings, 0 replies; 9+ messages in thread
From: jakub at redhat dot com @ 2008-07-08 7:54 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From jakub at redhat dot com 2008-07-08 07:53 -------
Just check the man page/info libc, for {{,un}signed ,}char %hhx.
Note this bugzilla is for reporting bugs in glibc, not a newbie programmer
help forum.
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Bug regex/6722] sscanf bug when parsing lines from /proc/net/tcp
2008-07-04 20:04 [Bug regex/6722] New: sscanf bug when parsing lines from /proc/net/tcp lists at roberthogan dot net
` (6 preceding siblings ...)
2008-07-08 7:54 ` jakub at redhat dot com
@ 2008-07-08 17:53 ` lists at roberthogan dot net
7 siblings, 0 replies; 9+ messages in thread
From: lists at roberthogan dot net @ 2008-07-08 17:53 UTC (permalink / raw)
To: glibc-bugs-regex
------- Additional Comments From lists at roberthogan dot net 2008-07-08 17:52 -------
(In reply to comment #7)
> Just check the man page/info libc, for {{,un}signed ,}char %hhx.
> Note this bugzilla is for reporting bugs in glibc, not a newbie programmer
> help forum.
Lesson learnt! Apologies for not researching this more thoroughly and thanks to
all for taking the time to point out my mistake.
--
http://sourceware.org/bugzilla/show_bug.cgi?id=6722
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
^ permalink raw reply [flat|nested] 9+ messages in thread