From f7dfe5d679f9f5b347c481f59476ac7cebbc1579 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Sat, 10 Dec 2011 15:01:08 +0100 Subject: [PATCH] Don't crash on bad user input. * nsfns.m (ns_get_defaults_value): New function. (Fns_get_resource, x_get_string_resource): Call ns_get_defaults_value. * nsterm.h (ns_get_defaults_value): Declare. * nsterm.m (ns_default): Call ns_get_defaults_value. Fixes: debbugs:10103 --- src/ChangeLog | 9 +++++++++ src/nsfns.m | 18 +++++++++++++----- src/nsterm.h | 1 + src/nsterm.m | 6 ++---- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 026aa6f0d04..94808c76c15 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2011-12-10 Jan Djärv + + * nsfns.m (ns_get_defaults_value): New function (Bug#10103). + (Fns_get_resource, x_get_string_resource): Call ns_get_defaults_value. + + * nsterm.h (ns_get_defaults_value): Declare. + + * nsterm.m (ns_default): Call ns_get_defaults_value. + 2011-12-09 Eli Zaretskii * xdisp.c (try_scrolling): Don't set scroll_down_p if dy is zero. diff --git a/src/nsfns.m b/src/nsfns.m index 482650fab2b..9dade071e85 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -1546,6 +1546,17 @@ Optional arg INIT, if non-nil, provides a default file name to use. */) return ret ? fname : Qnil; } +const char * +ns_get_defaults_value (const char *key) +{ + NSObject *obj = [[NSUserDefaults standardUserDefaults] + objectForKey: [NSString stringWithUTF8String: key]]; + + if (!obj) return NULL; + + return [[NSString stringWithFormat: @"%@", obj] UTF8String]; +} + DEFUN ("ns-get-resource", Fns_get_resource, Sns_get_resource, 2, 2, 0, doc: /* Return the value of the property NAME of OWNER from the defaults database. @@ -1560,9 +1571,7 @@ If OWNER is nil, Emacs is assumed. */) CHECK_STRING (name); /*fprintf (stderr, "ns-get-resource checking resource '%s'\n", SDATA (name)); */ - value =[[[NSUserDefaults standardUserDefaults] - objectForKey: [NSString stringWithUTF8String: SDATA (name)]] - UTF8String]; + value = ns_get_defaults_value (SDATA (name)); if (value) return build_string (value); @@ -2217,8 +2226,7 @@ x_get_string_resource (XrmDatabase rdb, char *name, char *class) /* --quick was passed, so this is a no-op. */ return NULL; - res = [[[NSUserDefaults standardUserDefaults] objectForKey: - [NSString stringWithUTF8String: toCheck]] UTF8String]; + res = ns_get_defaults_value (toCheck); return !res ? NULL : (!strncasecmp (res, "YES", 3) ? "true" : (!strncasecmp (res, "NO", 2) ? "false" : res)); diff --git a/src/nsterm.h b/src/nsterm.h index 52246caac84..e6c070fcaad 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -760,6 +760,7 @@ extern void ns_release_object (void *obj); extern void ns_retain_object (void *obj); extern void *ns_alloc_autorelease_pool (); extern void ns_release_autorelease_pool (); +extern const char *ns_get_defaults_value (); /* in nsmenu */ extern void update_frame_tool_bar (FRAME_PTR f); diff --git a/src/nsterm.m b/src/nsterm.m index 17fd5a93f63..1d645943065 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -3824,11 +3824,9 @@ ns_default (const char *parameter, Lisp_Object *result, Check a parameter value in user's preferences -------------------------------------------------------------------------- */ { - const char *value; + const char *value = ns_get_defaults_value (parameter); - if ( (value =[[[NSUserDefaults standardUserDefaults] - stringForKey: [NSString stringWithUTF8String: parameter]] - UTF8String]) ) + if (value) { double f; char *pos; -- 2.39.2