diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2016-10-19 22:15:01 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2016-10-19 22:15:01 +0200 |
commit | 70ac75f4ab184c21d11b9840a47362610aaef481 (patch) | |
tree | 183b9ec7e6897fb2cea7296b461a35ca93dfce6e /nx-X11/lib/X11/lcFile.c | |
parent | 6c303d9e4ffd162b8c7f59a4b135e592d923a656 (diff) | |
parent | 70e9d346fe34af127d2c827c3678e53d0f4312ae (diff) | |
download | nx-libs-70ac75f4ab184c21d11b9840a47362610aaef481.tar.gz nx-libs-70ac75f4ab184c21d11b9840a47362610aaef481.tar.bz2 nx-libs-70ac75f4ab184c21d11b9840a47362610aaef481.zip |
Merge branch 'uli42-pr/libX11_further_backports' into 3.6.x
Attributes GH PR #222: https://github.com/ArcticaProject/nx-libs/pull/222
Diffstat (limited to 'nx-X11/lib/X11/lcFile.c')
-rw-r--r-- | nx-X11/lib/X11/lcFile.c | 209 |
1 files changed, 82 insertions, 127 deletions
diff --git a/nx-X11/lib/X11/lcFile.c b/nx-X11/lib/X11/lcFile.c index 8c2e7c062..eeb6ce312 100644 --- a/nx-X11/lib/X11/lcFile.c +++ b/nx-X11/lib/X11/lcFile.c @@ -401,10 +401,7 @@ resolve_name( from = args[1], to = args[0]; /* right to left */ } if (! strcmp(from, lc_name)) { - name = Xmalloc(strlen(to) + 1); - if (name != NULL) { - strcpy(name, to); - } + name = strdup(to); break; } } @@ -489,9 +486,11 @@ _XlcFileName( for (i = 0; i < n; ++i) { char buf[PATH_MAX], *name; + if (args[i] == NULL) + continue; + name = NULL; - if ((5 + (args[i] ? strlen (args[i]) : 0) + strlen(cat)) < PATH_MAX) { - sprintf(buf, "%s/%s.dir", args[i], cat); + if (snprintf(buf, PATH_MAX, "%s/%s.dir", args[i], cat) < PATH_MAX) { name = resolve_name(siname, buf, RtoL); } if (name == NULL) { @@ -501,13 +500,13 @@ _XlcFileName( /* supposed to be absolute path name */ file_name = name; } else { - file_name = Xmalloc(2 + (args[i] ? strlen (args[i]) : 0) + - (name ? strlen (name) : 0)); - if (file_name != NULL) - sprintf(file_name, "%s/%s", args[i], name); + if (snprintf(buf, PATH_MAX, "%s/%s", args[i], name) < PATH_MAX) + file_name = strdup(buf); + else + file_name = NULL; Xfree(name); } - if (isreadable(file_name)) { + if (file_name && isreadable(file_name)) { break; } Xfree(file_name); @@ -538,9 +537,11 @@ _XlcResolveLocaleName( xlocaledir (dir, PATH_MAX); n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { - if ((2 + (args[i] ? strlen (args[i]) : 0) + - strlen (locale_alias)) < PATH_MAX) { - sprintf (buf, "%s/%s", args[i], locale_alias); + if (args[i] == NULL) + continue; + + if (snprintf (buf, PATH_MAX, "%s/%s", args[i], locale_alias) + < PATH_MAX) { name = resolve_name (lc_name, buf, LtoR); if (!name) { if (!nlc_name) @@ -553,12 +554,11 @@ _XlcResolveLocaleName( break; } } - if (nlc_name) Xfree(nlc_name); + Xfree(nlc_name); if (name == NULL) { /* vendor locale name == Xlocale name, no expansion of alias */ - pub->siname = Xmalloc (strlen (lc_name) + 1); - strcpy (pub->siname, lc_name); + pub->siname = strdup (lc_name); } else { pub->siname = name; } @@ -615,14 +615,14 @@ _XlcResolveI18NPath(char *buf, int buf_len) } char * -_XlcLocaleDirName(char *dir_name, size_t dir_len, char *lc_name) +_XlcLocaleDirName(char *dir_name, size_t dir_len, const char *lc_name) { - char dir[PATH_MAX], buf[PATH_MAX], *name = NULL; + char dir[PATH_MAX], buf[PATH_MAX]; int i, n; char *args[NUM_LOCALEDIR]; static char locale_alias[] = LOCALE_ALIAS; - char *target_name = (char*)0; - char *target_dir = (char*)0; + char *target_name = NULL; + char *target_dir = NULL; char *nlc_name = NULL; static char* last_dir_name = 0; static size_t last_dir_len = 0; @@ -635,94 +635,72 @@ _XlcLocaleDirName(char *dir_name, size_t dir_len, char *lc_name) } xlocaledir (dir, PATH_MAX); - n = _XlcParsePath(dir, args, 256); + n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { + char *name = NULL; + + if (args[i] == NULL) + continue; - if ((2 + (args[i] ? strlen(args[i]) : 0) + - strlen(locale_alias)) < PATH_MAX) { - sprintf (buf, "%s/%s", args[i], locale_alias); - name = resolve_name(lc_name, buf, LtoR); + if (snprintf (buf, PATH_MAX, "%s/%s", args[i], locale_alias) + < PATH_MAX) { + name = resolve_name(lc_name, buf, LtoR); if (!name) { if (!nlc_name) nlc_name = normalize_lcname(lc_name); if (nlc_name) name = resolve_name (nlc_name, buf, LtoR); } - } - - /* If name is not an alias, use lc_name for locale.dir search */ - if (name == NULL) - name = lc_name; + } - /* look at locale.dir */ + /* look at locale.dir */ - target_dir = args[i]; - if (!target_dir) { - /* something wrong */ - if (name != lc_name) - Xfree(name); - continue; - } - if ((1 + (target_dir ? strlen (target_dir) : 0) + - strlen("locale.dir")) < PATH_MAX) { - sprintf(buf, "%s/locale.dir", target_dir); - target_name = resolve_name(name, buf, RtoL); - } - if (name != lc_name) - Xfree(name); - if (target_name != NULL) { - char *p = 0; - if ((p = strstr(target_name, "/XLC_LOCALE"))) { - *p = '\0'; - break; - } - Xfree(target_name); - target_name = NULL; - } + target_dir = args[i]; + if (snprintf(buf, PATH_MAX, "%s/locale.dir", target_dir) < PATH_MAX) { + /* If name is not an alias, use lc_name for locale.dir search */ + target_name = resolve_name(name ? name : lc_name, buf, RtoL); + } + Xfree(name); name = NULL; + if (target_name != NULL) { + char *p = 0; + if ((p = strstr(target_name, "/XLC_LOCALE"))) { + *p = '\0'; + break; + } + Xfree(target_name); + target_name = NULL; + } } - if (nlc_name) Xfree(nlc_name); + Xfree(nlc_name); - if (target_name == NULL) { - /* vendor locale name == Xlocale name, no expansion of alias */ - target_dir = args[0]; - target_name = lc_name; - } - /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */ - strncpy(dir_name, target_dir, dir_len - 1); - if (strlen(target_dir) >= dir_len - 1) { - dir_name[dir_len - 1] = '\0'; - } else { - strcat(dir_name, "/"); - strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1); - if (strlen(target_name) >= dir_len - strlen(dir_name) - 1) - dir_name[dir_len - 1] = '\0'; - } - if (target_name != lc_name) - Xfree(target_name); + if (target_name == NULL) + /* vendor locale name == Xlocale name, no expansion of alias */ + snprintf(dir_name, dir_len, "%s/%s", args[0], lc_name); + else + snprintf(dir_name, dir_len, "%s/%s", target_dir, target_name); + + Xfree(target_name); + Xfree (last_dir_name); + Xfree (last_lc_name); - if (last_dir_name != 0) - Xfree (last_dir_name); - if (last_lc_name != 0) - Xfree (last_lc_name); last_dir_len = strlen (dir_name) + 1; last_dir_name = Xmalloc (last_dir_len); strcpy (last_dir_name, dir_name); - last_lc_name = Xmalloc (strlen (lc_name) + 1); - strcpy (last_lc_name, lc_name); + last_lc_name = strdup (lc_name); return dir_name; } char * -_XlcLocaleLibDirName(char *dir_name, size_t dir_len, char *lc_name) +_XlcLocaleLibDirName(char *dir_name, size_t dir_len, const char *lc_name) { - char dir[PATH_MAX], buf[PATH_MAX], *name = NULL; + char dir[PATH_MAX], buf[PATH_MAX]; int i, n; char *args[NUM_LOCALEDIR]; static char locale_alias[] = LOCALE_ALIAS; - char *target_name = (char*)0; - char *target_dir = (char*)0; + char *target_name = NULL; + char *target_dir = NULL; char *nlc_name = NULL; static char* last_dir_name = 0; static size_t last_dir_len = 0; @@ -735,12 +713,15 @@ _XlcLocaleLibDirName(char *dir_name, size_t dir_len, char *lc_name) } xlocalelibdir (dir, PATH_MAX); - n = _XlcParsePath(dir, args, 256); + n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { + char *name = NULL; - if ((2 + (args[i] ? strlen(args[i]) : 0) + - strlen(locale_alias)) < PATH_MAX) { - sprintf (buf, "%s/%s", args[i], locale_alias); + if (args[i] == NULL) + continue; + + if (snprintf (buf, PATH_MAX, "%s/%s", args[i], locale_alias) + < PATH_MAX) { name = resolve_name(lc_name, buf, LtoR); if (!name) { if (!nlc_name) @@ -750,26 +731,15 @@ _XlcLocaleLibDirName(char *dir_name, size_t dir_len, char *lc_name) } } - /* If name is not an alias, use lc_name for locale.dir search */ - if (name == NULL) - name = lc_name; - /* look at locale.dir */ target_dir = args[i]; - if (!target_dir) { - /* something wrong */ - if (name != lc_name) - Xfree(name); - continue; + if (snprintf(buf, PATH_MAX, "%s/locale.dir", target_dir) < PATH_MAX) { + /* If name is not an alias, use lc_name for locale.dir search */ + target_name = resolve_name(name ? name : lc_name, buf, RtoL); } - if ((1 + (target_dir ? strlen (target_dir) : 0) + - strlen("locale.dir")) < PATH_MAX) { - sprintf(buf, "%s/locale.dir", target_dir); - target_name = resolve_name(name, buf, RtoL); - } - if (name != lc_name) - Xfree(name); + Xfree(name); + name = NULL; if (target_name != NULL) { char *p = 0; if ((p = strstr(target_name, "/XLC_LOCALE"))) { @@ -779,37 +749,22 @@ _XlcLocaleLibDirName(char *dir_name, size_t dir_len, char *lc_name) Xfree(target_name); target_name = NULL; } - name = NULL; } - if (nlc_name) Xfree(nlc_name); + Xfree(nlc_name); - if (target_name == NULL) { + if (target_name == NULL) /* vendor locale name == Xlocale name, no expansion of alias */ - target_dir = args[0]; - target_name = lc_name; - } - /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */ - strncpy(dir_name, target_dir, dir_len - 1); - if (strlen(target_dir) >= dir_len - 1) { - dir_name[dir_len - 1] = '\0'; - } else { - strcat(dir_name, "/"); - strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1); - if (strlen(target_name) >= dir_len - strlen(dir_name) - 1) - dir_name[dir_len - 1] = '\0'; - } - if (target_name != lc_name) - Xfree(target_name); + snprintf(dir_name, dir_len, "%s/%s", args[0], lc_name); + else + snprintf(dir_name, dir_len, "%s/%s", target_dir, target_name); + Xfree(target_name); + Xfree (last_dir_name); + Xfree (last_lc_name); - if (last_dir_name != 0) - Xfree (last_dir_name); - if (last_lc_name != 0) - Xfree (last_lc_name); last_dir_len = strlen (dir_name) + 1; last_dir_name = Xmalloc (last_dir_len); strcpy (last_dir_name, dir_name); - last_lc_name = Xmalloc (strlen (lc_name) + 1); - strcpy (last_lc_name, lc_name); + last_lc_name = strdup (lc_name); return dir_name; } |