openbsd-ports/x11/mowitz/patches/patch-Mowitz_MwFilesel_c
2008-12-01 19:16:39 +00:00

200 lines
5.6 KiB
Plaintext

$OpenBSD: patch-Mowitz_MwFilesel_c,v 1.2 2008/12/01 19:16:39 jasper Exp $
--- Mowitz/MwFilesel.c.orig Thu Jan 16 21:31:13 2003
+++ Mowitz/MwFilesel.c Mon Dec 1 13:19:37 2008
@@ -64,6 +64,15 @@ static Widget fsel_pshell, fsel_form, fsel_topframe, f
fsel_okbutton, fsel_cancelbutton, fsel_findbutton,
fsel_helpbutton, fsel_extra[10], below;
+
+size_t
+strnlen (const char *string, size_t maxlen)
+{
+ const char *end = memchr (string, '\0', maxlen);
+ return end ? (size_t) (end - string) : maxlen;
+}
+
+
static int nextra;
static int ch_ext;
@@ -80,7 +89,7 @@ getdirent(char ***ldirp, int *ndirp, char ***lfilep, i
{
DIR *dird;
struct dirent *dire;
- char fn[1024];
+ char fn[PATH_MAX];
struct stat buf;
char **ldir = NULL, **lfile = NULL;
int ndir = 0, mdir = 0, nfile = 0, mfile = 0;
@@ -90,7 +99,10 @@ getdirent(char ***ldirp, int *ndirp, char ***lfilep, i
return 1;
}
while ((dire = readdir(dird))) {
- sprintf(fn, "%s/%s", path, dire->d_name);
+ if (snprintf(fn, PATH_MAX, "%s/%s", path, dire->d_name) >= PATH_MAX) {
+ fprintf(stderr, "Path too long %s/%s\n", path, dire->d_name);
+ continue;
+ }
if ((stat(fn, &buf))) {
fprintf(stderr, "Can't stat %s\n", fn);
continue;
@@ -169,13 +181,17 @@ static void make_dirmenu(char *);
static void fsel_scan(void)
{
String string;
- char dir[1024];
+ char dir[PATH_MAX];
char pattern[1024];
char *pst;
if (files != NULL)
freedirent(dirs, ndirs, files, nfiles);
-
+
+ if (strnlen(MwLabelGet(fsel_dirbutton), PATH_MAX)>=PATH_MAX) {
+ fprintf(stderr, "Path too long %s\n", MwLabelGet(fsel_dirbutton));
+ return;
+ }
strcpy(dir, MwLabelGet(fsel_dirbutton));
string = MwLabelGet(fsel_formatbutton);
pst = strchr(string, '(');
@@ -183,15 +199,20 @@ static void fsel_scan(void)
/* apparently no pattern here; use foolproof default */
strcpy(pattern, "*");
} else {
+ if (strnlen(pst+1, 1024) >= 1024) {
+ fprintf(stderr, "Pattern too long %s\n", pattern);
+ return;
+ }
strcpy(pattern, pst+1);
if ((pst = strchr(pattern, ')')))
*pst = '\0';
}
if (getdirent(&dirs, &ndirs, &files, &nfiles, dir, pattern)) {
fprintf(stderr, "Grmbl. getdirent() failed\n");
+ } else {
+ make_files(files, nfiles);
+ make_dirs(dirs, ndirs);
}
- make_files(files, nfiles);
- make_dirs(dirs, ndirs);
make_dirmenu(dir);
}
@@ -248,22 +269,24 @@ static void file_select(Widget w, XtPointer client_dat
static void dir_select(Widget w, XtPointer client_data, XtPointer call_data)
{
- char path[1024];
- char newpath[1024];
+ char path[PATH_MAX];
+ char newpath[PATH_MAX];
XawListReturnStruct *list_struct = (XawListReturnStruct *)call_data;
String string = list_struct->string;
- sprintf(path, "%s/%s", MwLabelGet(fsel_dirbutton), string);
-
- if (!realpath(path, newpath))
- fprintf(stderr, "Couldn't realpath %s\n", path);
-
- MwLabelSet(fsel_dirbutton, newpath);
-
- XawListUnhighlight(fsel_filelist);
- XawListUnhighlight(fsel_dirlist);
- fsel_scan();
+ if(snprintf(path, PATH_MAX, "%s/%s", MwLabelGet(fsel_dirbutton), string) >= PATH_MAX) {
+ fprintf(stderr, "Path too long %s/%s\n", MwLabelGet(fsel_dirbutton), string);
+ } else {
+ if (!realpath(path, newpath)) {
+ fprintf(stderr, "Couldn't realpath %s\n", path);
+ } else {
+ MwLabelSet(fsel_dirbutton, newpath);
+ XawListUnhighlight(fsel_filelist);
+ XawListUnhighlight(fsel_dirlist);
+ fsel_scan();
+ }
+ }
}
static void make_menu(char **menu_entry_names, Widget menu)
@@ -299,17 +322,14 @@ static struct {
static void change_dir(Widget w, XtPointer client_data, XtPointer call_data)
{
- char path[1024];
- char newpath[1024];
+ char newpath[PATH_MAX];
- strcpy(path, (char *)client_data);
-
- if (!realpath(path, newpath))
- fprintf(stderr, "Couldn't realpath %s\n", path);
-
- MwLabelSet(fsel_dirbutton, newpath);
-
- fsel_scan();
+ if (!realpath((char *)client_data, newpath)) {
+ fprintf(stderr, "Couldn't realpath %s\n", (char *)client_data);
+ } else {
+ MwLabelSet(fsel_dirbutton, newpath);
+ fsel_scan();
+ }
}
static void make_dirmenu(char *dir)
@@ -357,16 +377,33 @@ static int status;
static void fsel_done(Widget w, XtPointer client_data, XtPointer call_data)
{
- char path[1024], newpath[1024];
+ char path[PATH_MAX], newpath[PATH_MAX];
struct stat buf;
String string;
+ int failed = 0;
XtVaGetValues(fsel_filetext,
XtNstring, &string, (char *)0);
- if (string[0] == '/') strcpy(path, string);
- else sprintf(path, "%s/%s", MwLabelGet(fsel_dirbutton), string);
- realpath(path, newpath);
- if (!stat(newpath, &buf) &&
- (S_IFDIR & buf.st_mode)) {
+
+ if (string[0] == '/') {
+ if (strlen(string) >= PATH_MAX) {
+ fprintf(stderr, "Filename too long %s\n", string);
+ failed = 1;
+ } else {
+ strcpy(path, string);
+ }
+ } else {
+ if (snprintf(path, PATH_MAX, "%s/%s", MwLabelGet(fsel_dirbutton), string) >= PATH_MAX) {
+ fprintf(stderr, "Path too long %s/%s\n", MwLabelGet(fsel_dirbutton), string);
+ failed = 1;
+ }
+ }
+ if(!failed && !realpath(path, newpath)) {
+ newpath[0] = '\0';
+ fprintf(stderr, "Couldn't realpath %s\n", path);
+ failed = 1;
+ }
+ if (failed ||
+ (!stat(newpath, &buf) && (S_IFDIR & buf.st_mode))) {
MwLabelSet(fsel_dirbutton, newpath);
XtVaSetValues(fsel_filetext,
XtNstring, "", (char *)0);
@@ -690,7 +727,7 @@ int MwFileselInput(Widget pw, char *path, char *name,
String string;
XtAppContext app_context = XtWidgetToApplicationContext(pw);
int i;
- char newpath[1024];
+ char newpath[PATH_MAX];
if (!realpath(path, newpath))
getcwd(newpath, sizeof newpath);
@@ -745,4 +782,3 @@ int MwFileselInput(Widget pw, char *path, char *name,
strcpy(fmt, MwLabelGet(fsel_formatbutton));
return status;
}
-