diff options
| author | Tomoyuki Sahara <[email protected]> | 2013-09-26 10:59:40 +0900 |
|---|---|---|
| committer | Tomoyuki Sahara <[email protected]> | 2013-09-26 10:59:40 +0900 |
| commit | e27fb544dfea1c596a7819e5d467129374b3a6fd (patch) | |
| tree | 88dcac18bea303557963d251db2f407e6d054719 /src | |
| parent | e2b0606752b5a5800c7cb908080eea6bef337a1b (diff) | |
| download | mruby-e27fb544dfea1c596a7819e5d467129374b3a6fd.tar.gz mruby-e27fb544dfea1c596a7819e5d467129374b3a6fd.zip | |
suppress a warning and fix a possible segv.
Diffstat (limited to 'src')
| -rw-r--r-- | src/file.c | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/src/file.c b/src/file.c index 2585e314e..0fed5b21a 100644 --- a/src/file.c +++ b/src/file.c @@ -235,41 +235,31 @@ mrb_file_is_absolute_path(const char *path) static mrb_value mrb_file__gethome(mrb_state *mrb, mrb_value klass) { - mrb_value username, result; - char *cuser, *home; + mrb_value username; int argc; - struct passwd *pwd; + char *home; argc = mrb_get_args(mrb, "|S", &username); - if (argc == 0) { home = getenv("HOME"); - } else { - cuser = mrb_str_to_cstr(mrb, username); - if ((pwd = getpwnam(cuser)) == NULL) { + if (home == NULL) { return mrb_nil_value(); - } else { - home = pwd->pw_dir; } - } - - if (home == NULL) { - return mrb_nil_value(); - } - - if (!mrb_file_is_absolute_path(home)) { - if (argc && strlen(cuser) > 0) { - mrb_raisef(mrb, E_ARGUMENT_ERROR, "non-absolute home of ~%s", cuser); - } else { + if (!mrb_file_is_absolute_path(home)) { mrb_raise(mrb, E_ARGUMENT_ERROR, "non-absolute home"); } + } else { + const char *cuser = mrb_str_to_cstr(mrb, username); + struct passwd *pwd = getpwnam(cuser); + if (pwd == NULL) { + return mrb_nil_value(); + } + home = pwd->pw_dir; + if (!mrb_file_is_absolute_path(home)) { + mrb_raisef(mrb, E_ARGUMENT_ERROR, "non-absolute home of ~%S", username); + } } - - result = mrb_str_buf_new(mrb, MAXPATHLEN); - strncpy(RSTRING_PTR(result), home, MAXPATHLEN); - mrb_str_resize(mrb, result, strlen(RSTRING_PTR(result))); - - return result; + return mrb_str_new_cstr(mrb, home); } void |
