char *key;
char *value;
time_t timeout;
- bool ret;
+ bool ret = true;
key = talloc_asprintf(talloc_tos(), "IDMAP/UID2SID/%d", (int)uid);
if (key == NULL) {
return false;
}
ZERO_STRUCTP(sid);
- ret = string_to_sid(sid, value);
+ if (value[0] != '-') {
+ ret = string_to_sid(sid, value);
+ }
SAFE_FREE(value);
if (ret) {
*expired = (timeout <= time(NULL));
}
if (uid != -1) {
fstr_sprintf(key, "IDMAP/UID2SID/%d", (int)uid);
- sid_to_fstring(value, sid);
- timeout = is_null_sid(sid)
- ? lp_idmap_negative_cache_time()
- : lp_idmap_cache_time();
+ if (is_null_sid(sid)) {
+ /* negative uid mapping */
+ fstrcpy(value, "-");
+ timeout = lp_idmap_negative_cache_time();
+ }
+ else {
+ sid_to_fstring(value, sid);
+ timeout = lp_idmap_cache_time();
+ }
gencache_set(key, value, now + timeout);
}
}
char *key;
char *value;
time_t timeout;
- bool ret;
+ bool ret = true;
key = talloc_asprintf(talloc_tos(), "IDMAP/GID2SID/%d", (int)gid);
if (key == NULL) {
return false;
}
ZERO_STRUCTP(sid);
- ret = string_to_sid(sid, value);
+ if (value[0] != '-') {
+ ret = string_to_sid(sid, value);
+ }
SAFE_FREE(value);
if (ret) {
*expired = (timeout <= time(NULL));
}
if (gid != -1) {
fstr_sprintf(key, "IDMAP/GID2SID/%d", (int)gid);
- sid_to_fstring(value, sid);
- timeout = is_null_sid(sid)
- ? lp_idmap_negative_cache_time()
- : lp_idmap_cache_time();
+ if (is_null_sid(sid)) {
+ /* negative gid mapping */
+ fstrcpy(value, "-");
+ timeout = lp_idmap_negative_cache_time();
+ }
+ else {
+ sid_to_fstring(value, sid);
+ timeout = lp_idmap_cache_time();
+ }
gencache_set(key, value, now + timeout);
}
}