diff options
| author | nicm <> | 2016-09-04 16:56:02 +0000 |
|---|---|---|
| committer | nicm <> | 2016-09-04 16:56:02 +0000 |
| commit | d7124f76ae800a41e16411b0c22be2a341c922f5 (patch) | |
| tree | 1d157a43748660f622e2a5cb7be066097f3cea4b /src/lib/libc | |
| parent | 09db2f3586369ef8cf88ed6e6d1ab5189aceb610 (diff) | |
| download | openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.tar.gz openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.tar.bz2 openbsd-d7124f76ae800a41e16411b0c22be2a341c922f5.zip | |
Set errno more consistently, and fix a warning, ok tedu
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libc/stdlib/icdb.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/src/lib/libc/stdlib/icdb.c b/src/lib/libc/stdlib/icdb.c index e135bf025e..2ddd9db48c 100644 --- a/src/lib/libc/stdlib/icdb.c +++ b/src/lib/libc/stdlib/icdb.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: icdb.c,v 1.7 2016/09/04 14:51:39 nicm Exp $ */ | 1 | /* $OpenBSD: icdb.c,v 1.8 2016/09/04 16:56:02 nicm Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org> | 3 | * Copyright (c) 2015 Ted Unangst <tedu@openbsd.org> |
| 4 | * | 4 | * |
| @@ -14,14 +14,16 @@ | |||
| 14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | 14 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
| 15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 15 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| 16 | */ | 16 | */ |
| 17 | |||
| 18 | #include <errno.h> | ||
| 17 | #include <fcntl.h> | 19 | #include <fcntl.h> |
| 20 | #include <icdb.h> | ||
| 21 | #include <stddef.h> | ||
| 18 | #include <stdint.h> | 22 | #include <stdint.h> |
| 19 | #include <stdio.h> | 23 | #include <stdio.h> |
| 20 | #include <stddef.h> | ||
| 21 | #include <stdlib.h> | 24 | #include <stdlib.h> |
| 22 | #include <string.h> | 25 | #include <string.h> |
| 23 | #include <unistd.h> | 26 | #include <unistd.h> |
| 24 | #include <icdb.h> | ||
| 25 | 27 | ||
| 26 | #include <sys/mman.h> | 28 | #include <sys/mman.h> |
| 27 | #include <sys/stat.h> | 29 | #include <sys/stat.h> |
| @@ -120,10 +122,10 @@ icdb_new(uint32_t version, uint32_t nentries, uint32_t entrysize, | |||
| 120 | struct icdbinfo *info; | 122 | struct icdbinfo *info; |
| 121 | int i; | 123 | int i; |
| 122 | 124 | ||
| 123 | if (entrysize == 0 || entrysize > 1048576) | 125 | if (entrysize == 0 || entrysize > 1048576 || nkeys > 8) { |
| 124 | return NULL; | 126 | errno = EINVAL; |
| 125 | if (nkeys > 8) | ||
| 126 | return NULL; | 127 | return NULL; |
| 128 | } | ||
| 127 | 129 | ||
| 128 | if (!(db = calloc(1, sizeof(*db)))) | 130 | if (!(db = calloc(1, sizeof(*db)))) |
| 129 | return NULL; | 131 | return NULL; |
| @@ -156,7 +158,7 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
| 156 | struct stat sb; | 158 | struct stat sb; |
| 157 | uint8_t *ptr = MAP_FAILED; | 159 | uint8_t *ptr = MAP_FAILED; |
| 158 | uint32_t baseoff, indexsize, idxmask, idxlen; | 160 | uint32_t baseoff, indexsize, idxmask, idxlen; |
| 159 | int fd, i; | 161 | int fd, i, saved_errno; |
| 160 | 162 | ||
| 161 | if ((fd = open(name, flags | O_CLOEXEC)) == -1) | 163 | if ((fd = open(name, flags | O_CLOEXEC)) == -1) |
| 162 | return NULL; | 164 | return NULL; |
| @@ -169,10 +171,10 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
| 169 | if (ptr == MAP_FAILED) | 171 | if (ptr == MAP_FAILED) |
| 170 | goto fail; | 172 | goto fail; |
| 171 | info = (struct icdbinfo *)ptr; | 173 | info = (struct icdbinfo *)ptr; |
| 172 | if (info->magic != magic) | 174 | if (info->magic != magic || info->version != version) { |
| 173 | goto fail; | 175 | errno = ENOENT; |
| 174 | if (info->version != version) | ||
| 175 | goto fail; | 176 | goto fail; |
| 177 | } | ||
| 176 | 178 | ||
| 177 | if (!(db = calloc(1, sizeof(*db)))) | 179 | if (!(db = calloc(1, sizeof(*db)))) |
| 178 | goto fail; | 180 | goto fail; |
| @@ -191,11 +193,13 @@ icdb_open(const char *name, int flags, uint32_t version) | |||
| 191 | return db; | 193 | return db; |
| 192 | 194 | ||
| 193 | fail: | 195 | fail: |
| 196 | saved_errno = errno; | ||
| 194 | if (ptr != MAP_FAILED) | 197 | if (ptr != MAP_FAILED) |
| 195 | munmap(ptr, sb.st_size); | 198 | munmap(ptr, sb.st_size); |
| 196 | if (fd != -1) | 199 | if (fd != -1) |
| 197 | close(fd); | 200 | close(fd); |
| 198 | free(db); | 201 | free(db); |
| 202 | errno = saved_errno; | ||
| 199 | return NULL; | 203 | return NULL; |
| 200 | } | 204 | } |
| 201 | DEF_WEAK(icdb_open); | 205 | DEF_WEAK(icdb_open); |
| @@ -211,14 +215,15 @@ icdb_get(struct icdb *db, void *entry, uint32_t idx) | |||
| 211 | DEF_WEAK(icdb_get); | 215 | DEF_WEAK(icdb_get); |
| 212 | 216 | ||
| 213 | int | 217 | int |
| 214 | icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t *idxp) | 218 | icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, |
| 219 | uint32_t *idxp) | ||
| 215 | { | 220 | { |
| 216 | struct icdbinfo *info = db->info; | 221 | struct icdbinfo *info = db->info; |
| 217 | uint32_t offset; | 222 | uint32_t offset; |
| 218 | uint64_t hash; | 223 | uint64_t hash; |
| 219 | uint32_t indexsize, idxmask, idxlen; | 224 | uint32_t indexsize, idxmask, idxlen; |
| 220 | uint32_t *idxdata; | 225 | uint32_t *idxdata; |
| 221 | 226 | ||
| 222 | indexsize = info->indexsize; | 227 | indexsize = info->indexsize; |
| 223 | idxmask = indexsize - 1; | 228 | idxmask = indexsize - 1; |
| 224 | idxlen = indexsize * sizeof(uint32_t); | 229 | idxlen = indexsize * sizeof(uint32_t); |
| @@ -227,8 +232,10 @@ icdb_lookup(struct icdb *db, int keynum, const void *key, void *entry, uint32_t | |||
| 227 | 232 | ||
| 228 | hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]); | 233 | hash = SipHash24(&info->siphashkey, key, info->keysize[keynum]); |
| 229 | while ((offset = idxdata[hash & idxmask]) != -1) { | 234 | while ((offset = idxdata[hash & idxmask]) != -1) { |
| 230 | if (icdb_get(db, entry, offset) != 0) | 235 | if (icdb_get(db, entry, offset) != 0) { |
| 236 | errno = ENOENT; | ||
| 231 | return -1; | 237 | return -1; |
| 238 | } | ||
| 232 | if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key, | 239 | if (memcmp((uint8_t *)entry + info->keyoffset[keynum], key, |
| 233 | info->keysize[keynum]) == 0) { | 240 | info->keysize[keynum]) == 0) { |
| 234 | if (idxp) | 241 | if (idxp) |
| @@ -262,16 +269,17 @@ icdb_update(struct icdb *db, const void *entry, int offset) | |||
| 262 | uint32_t entrysize = info->entrysize; | 269 | uint32_t entrysize = info->entrysize; |
| 263 | uint32_t baseoff; | 270 | uint32_t baseoff; |
| 264 | uint32_t indexsize, idxmask, idxlen; | 271 | uint32_t indexsize, idxmask, idxlen; |
| 265 | 272 | ||
| 266 | indexsize = info->indexsize; | 273 | indexsize = info->indexsize; |
| 267 | idxmask = indexsize - 1; | 274 | idxmask = indexsize - 1; |
| 268 | idxlen = indexsize * sizeof(uint32_t); | 275 | idxlen = indexsize * sizeof(uint32_t); |
| 269 | baseoff = sizeof(*info) + idxlen * info->nkeys; | 276 | baseoff = sizeof(*info) + idxlen * info->nkeys; |
| 270 | 277 | ||
| 271 | memcpy((uint8_t *)db->entries + offset * entrysize, | 278 | memcpy((uint8_t *)db->entries + offset * entrysize, entry, entrysize); |
| 272 | entry, entrysize); | 279 | if (db->fd != -1) { |
| 273 | if (db->fd != -1) | 280 | msync((uint8_t *)db->entries + offset * entrysize, entrysize, |
| 274 | msync(db->entries + offset * entrysize, entrysize, MS_SYNC); | 281 | MS_SYNC); |
| 282 | } | ||
| 275 | return 0; | 283 | return 0; |
| 276 | } | 284 | } |
| 277 | DEF_WEAK(icdb_update); | 285 | DEF_WEAK(icdb_update); |
| @@ -304,7 +312,7 @@ icdb_rehash(struct icdb *db) | |||
| 304 | uint32_t entrysize = info->entrysize; | 312 | uint32_t entrysize = info->entrysize; |
| 305 | uint32_t indexsize, idxmask, idxlen; | 313 | uint32_t indexsize, idxmask, idxlen; |
| 306 | int i, j; | 314 | int i, j; |
| 307 | 315 | ||
| 308 | indexsize = info->indexsize = roundup(info->nentries); | 316 | indexsize = info->indexsize = roundup(info->nentries); |
| 309 | idxmask = indexsize - 1; | 317 | idxmask = indexsize - 1; |
| 310 | idxlen = sizeof(uint32_t) * indexsize; | 318 | idxlen = sizeof(uint32_t) * indexsize; |
| @@ -341,10 +349,10 @@ icdb_save(struct icdb *db, int fd) | |||
| 341 | uint32_t entrysize = info->entrysize; | 349 | uint32_t entrysize = info->entrysize; |
| 342 | uint32_t indexsize, idxlen; | 350 | uint32_t indexsize, idxlen; |
| 343 | int i; | 351 | int i; |
| 344 | 352 | ||
| 345 | if (icdb_rehash(db) != 0) | 353 | if (icdb_rehash(db) != 0) |
| 346 | return -1; | 354 | return -1; |
| 347 | 355 | ||
| 348 | indexsize = info->indexsize; | 356 | indexsize = info->indexsize; |
| 349 | idxlen = sizeof(uint32_t) * indexsize; | 357 | idxlen = sizeof(uint32_t) * indexsize; |
| 350 | 358 | ||
