From: "j.ps@openmailbox.org" <j.ps@openmailbox.org>
To: netdev@vger.kernel.org
Cc: schwab@linux-m68k.org
Subject: Re: "ss -p" segfaults
Date: Tue, 21 Jul 2015 10:54:05 +0100 [thread overview]
Message-ID: <55AE16BD.40607@openmailbox.org> (raw)
In-Reply-To: <55AE15FE.6020802@openmailbox.org>
Patch for 4.1.1.
Essentially all that is needed to get rid of this issue is the
addition of:
memset(u, 0, sizeof(*u));
after:
if (!(u = malloc(sizeof(*u))))
break;
Also patched some other situations (strcpy and sprintf uses) that
potentially produce the same results.
Signed-off-by: Jose P Santos <j.ps@openmailbox.org>
--- iproute2-4.1.1/misc/ss.c.orig 2015-07-06 22:57:34.000000000 +0100
+++ iproute2-4.1.1/misc/ss.c 2015-07-21 10:26:45.000000000 +0100
@@ -456,7 +456,10 @@ static void user_ent_hash_build(void)
user_ent_hash_build_init = 1;
- strcpy(name, root);
+ /* Avoid buffer overrun if input size from PROC_ROOT > name */
+ memset(name, 0, sizeof(name));
+ strncpy(name, root, sizeof(name)-2);
+
if (strlen(name) == 0 || name[strlen(name)-1] != '/')
strcat(name, "/");
@@ -480,7 +483,7 @@ static void user_ent_hash_build(void)
if (getpidcon(pid, &pid_context) != 0)
pid_context = strdup(no_ctx);
- sprintf(name + nameoff, "%d/fd/", pid);
+ snprintf(name + nameoff, sizeof(name) - nameoff, "%d/fd/", pid);
pos = strlen(name);
if ((dir1 = opendir(name)) == NULL)
continue;
@@ -499,7 +502,7 @@ static void user_ent_hash_build(void)
if (sscanf(d1->d_name, "%d%c", &fd, &crap) != 1)
continue;
- sprintf(name+pos, "%d", fd);
+ snprintf(name+pos, sizeof(name) - pos, "%d", fd);
link_len = readlink(name, lnk, sizeof(lnk)-1);
if (link_len == -1)
@@ -2722,6 +2725,11 @@ static int unix_show(struct filter *f)
if (!(u = malloc(sizeof(*u))))
break;
+ /* Zero initialization of 'u' struct avoids a segfault
+ * when freeing memory 'free(name)' at 'unix_list_free()'.
+ */
+ memset(u, 0, sizeof(*u));
+
if (sscanf(buf, "%x: %x %x %x %x %x %d %s",
&u->rport, &u->rq, &u->wq, &flags, &u->type,
&u->state, &u->ino, name) < 8)
@@ -3064,11 +3072,13 @@ static int netlink_show_one(struct filte
strncpy(procname, "kernel", 6);
} else if (pid > 0) {
FILE *fp;
- sprintf(procname, "%s/%d/stat",
+ snprintf(procname, sizeof(procname), "%s/%d/stat",
getenv("PROC_ROOT") ? : "/proc", pid);
if ((fp = fopen(procname, "r")) != NULL) {
if (fscanf(fp, "%*d (%[^)])", procname) == 1) {
- sprintf(procname+strlen(procname), "/%d", pid);
+ snprintf(procname+strlen(procname),
+ sizeof(procname)-strlen(procname),
+ "/%d", pid);
done = 1;
}
fclose(fp);
On 2015-07-20 20:09, Stephen Hemminger wrote:
> Patches are always appreciated and this looks like a real bug.
> But before I can accept it there are a couple of small
> changes needed.
>
> 1. There is no need to check for NULL when calling free().
> Glibc free is documented to accept NULL as a valid request
> and do nothing.
>
> 2. Please add a Signed-off-by: line with a real name.
> Signed-off-by has legal meaning for the Developer's Certificate of Origin
> see kernel documentation if you need more explaination.
>
> 3. Although what you found is important, giving a full paragraph
> of personal comment about it is not required. The point is software
> should read like one source independent of who the authors are.
> Your comment is basically just justifying using strncpy.
>
> 4. Rather than strncpy() which has issues with maximal sized strings
> consider using strlcpy() instead.
>
> 5. Iproute2 uses kernel identation and style, consider running checkpatch
> on your changes.
>
> Please fixup and resubmit to netdev.
>
>
next prev parent reply other threads:[~2015-07-21 9:54 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20150719140548.6d17a475@urahara>
2015-07-20 7:07 ` Segmentation fault in iproute2 ss -p (versions 4.0.0, 4.1.0 and 4.1.1) j.ps
2015-07-20 19:09 ` Stephen Hemminger
2015-07-21 9:50 ` j.ps
2015-07-21 9:54 ` j.ps [this message]
2015-10-06 10:09 ` "ss -p" segfaults (updated to 4.2) Willy Tarreau
2015-10-10 14:34 ` j.ps
2015-10-12 16:50 ` Stephen Hemminger
2015-10-12 16:55 ` Willy Tarreau
[not found] <55AC9E8C.7040200@openmailbox.org>
2015-07-20 17:31 ` "ss -p" segfaults j.ps
2015-07-20 18:14 ` Andreas Schwab
2015-07-15 14:09 Marc Dietrich
2015-07-15 15:02 ` Vadim Kochan
2015-07-15 15:12 ` Vadim Kochan
2015-07-15 16:49 ` Rustad, Mark D
2015-07-15 18:52 ` Rustad, Mark D
2015-07-15 18:57 ` Vadim Kochan
2015-07-15 22:22 ` Vadim Kochan
2015-07-16 6:37 ` Marc Dietrich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=55AE16BD.40607@openmailbox.org \
--to=j.ps@openmailbox.org \
--cc=netdev@vger.kernel.org \
--cc=schwab@linux-m68k.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).