Per some comments from Lars Kellogg-Stedman <lars@larsshack.org>,

make xreadlink() return NULL on failure, and make sure everyone
uses the interface correctly.
 -Erik
This commit is contained in:
Eric Andersen 2001-05-07 17:48:28 +00:00
parent 822c3837f9
commit 28355a36da
7 changed files with 16 additions and 11 deletions

View File

@ -37,10 +37,7 @@ typedef int (*__link_f)(const char *, const char *);
*/
static char *busybox_fullpath()
{
char proc[256];
sprintf(proc, "/proc/%d/exe", getpid());
return xreadlink(proc);
return xreadlink("/proc/self/exe");
}
/* create (sym)links for each applet */

View File

@ -922,6 +922,8 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *header_name,
strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname));
} else if (S_ISLNK(statbuf->st_mode)) {
char *lpath = xreadlink(real_name);
if (!lpath) /* Already printed err msg inside xreadlink() */
return ( FALSE);
header.typeflag = SYMTYPE;
strncpy(header.linkname, lpath, sizeof(header.linkname));
free(lpath);

View File

@ -37,10 +37,7 @@ typedef int (*__link_f)(const char *, const char *);
*/
static char *busybox_fullpath()
{
char proc[256];
sprintf(proc, "/proc/%d/exe", getpid());
return xreadlink(proc);
return xreadlink("/proc/self/exe");
}
/* create (sym)links for each applet */

View File

@ -1,5 +1,6 @@
/*
* xreadlink.c - safe implementation of readlink
* xreadlink.c - safe implementation of readlink.
* Returns a NULL on failure...
*/
#include <stdio.h>
@ -22,8 +23,10 @@ extern char *xreadlink(const char *path)
do {
buf = xrealloc(buf, bufsize += GROWBY);
readsize = readlink(path, buf, bufsize); /* 1st try */
if (readsize == -1)
perror_msg("%s:%s", applet_name, path);
if (readsize == -1) {
perror_msg("%s:%s", applet_name, path);
return NULL;
}
}
while (bufsize < readsize + 1);

View File

@ -37,6 +37,8 @@ int readlink_main(int argc, char **argv)
show_usage();
buf = xreadlink(argv[1]);
if (!buf)
return EXIT_FAILURE;
puts(buf);
#ifdef BB_FEATURE_CLEAN_UP
free(buf);

View File

@ -37,6 +37,8 @@ int readlink_main(int argc, char **argv)
show_usage();
buf = xreadlink(argv[1]);
if (!buf)
return EXIT_FAILURE;
puts(buf);
#ifdef BB_FEATURE_CLEAN_UP
free(buf);

2
tar.c
View File

@ -922,6 +922,8 @@ writeTarHeader(struct TarBallInfo *tbInfo, const char *header_name,
strncpy(header.linkname, tbInfo->hlInfo->name, sizeof(header.linkname));
} else if (S_ISLNK(statbuf->st_mode)) {
char *lpath = xreadlink(real_name);
if (!lpath) /* Already printed err msg inside xreadlink() */
return ( FALSE);
header.typeflag = SYMTYPE;
strncpy(header.linkname, lpath, sizeof(header.linkname));
free(lpath);