1 /*
2    ldb database library
3 
4    Copyright (C) Andrew Tridgell 2004
5    Copyright (C) Stefan Metzmacher 2004
6    Copyright (C) Simo Sorce 2006-2008
7    Copyright (C) Matthias Dieter Wallnöfer 2009-2010
8 
9      ** NOTE! The following LGPL license applies to the ldb
10      ** library. This does NOT imply that all of Samba is released
11      ** under the LGPL
12 
13    This library is free software; you can redistribute it and/or
14    modify it under the terms of the GNU Lesser General Public
15    License as published by the Free Software Foundation; either
16    version 3 of the License, or (at your option) any later version.
17 
18    This library is distributed in the hope that it will be useful,
19    but WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    Lesser General Public License for more details.
22 
23    You should have received a copy of the GNU Lesser General Public
24    License along with this library; if not, see <http://www.gnu.org/licenses/>.
25 */
26 
27 /*
28  *  Name: ldb_tdb
29  *
30  *  Component: ldb tdb backend
31  *
32  *  Description: core functions for tdb backend
33  *
34  *  Author: Andrew Tridgell
35  *  Author: Stefan Metzmacher
36  *
37  *  Modifications:
38  *
39  *  - description: make the module use asynchronous calls
40  *    date: Feb 2006
41  *    Author: Simo Sorce
42  *
43  *  - description: make it possible to use event contexts
44  *    date: Jan 2008
45  *    Author: Simo Sorce
46  *
47  *  - description: fix up memory leaks and small bugs
48  *    date: Oct 2009
49  *    Author: Matthias Dieter Wallnöfer
50  */
51 
52 #include "ldb_tdb.h"
53 #include "ldb_private.h"
54 #include "../ldb_key_value/ldb_kv.h"
55 #include <tdb.h>
56 
57 /*
58   lock the database for read - use by ltdb_search and ltdb_sequence_number
59 */
ltdb_lock_read(struct ldb_module * module)60 static int ltdb_lock_read(struct ldb_module *module)
61 {
62 	void *data = ldb_module_get_private(module);
63 	struct ldb_kv_private *ldb_kv =
64 	    talloc_get_type(data, struct ldb_kv_private);
65 	int tdb_ret = 0;
66 	int ret;
67 	pid_t pid = getpid();
68 
69 	if (ldb_kv->pid != pid) {
70 		ldb_asprintf_errstring(ldb_module_get_ctx(module),
71 				       __location__
72 				       ": Reusing ldb opend by pid %d in "
73 				       "process %d\n",
74 				       ldb_kv->pid,
75 				       pid);
76 		return LDB_ERR_PROTOCOL_ERROR;
77 	}
78 
79 	if (tdb_transaction_active(ldb_kv->tdb) == false &&
80 	    ldb_kv->read_lock_count == 0) {
81 		tdb_ret = tdb_lockall_read(ldb_kv->tdb);
82 	}
83 	if (tdb_ret == 0) {
84 		ldb_kv->read_lock_count++;
85 		return LDB_SUCCESS;
86 	}
87 	ret = ltdb_err_map(tdb_error(ldb_kv->tdb));
88 	if (ret == LDB_SUCCESS) {
89 		ret = LDB_ERR_OPERATIONS_ERROR;
90 	}
91 	ldb_debug_set(ldb_module_get_ctx(module),
92 		      LDB_DEBUG_FATAL,
93 		      "Failure during ltdb_lock_read(): %s -> %s",
94 		      tdb_errorstr(ldb_kv->tdb),
95 		      ldb_strerror(ret));
96 	return ret;
97 }
98 
99 /*
100   unlock the database after a ltdb_lock_read()
101 */
ltdb_unlock_read(struct ldb_module * module)102 static int ltdb_unlock_read(struct ldb_module *module)
103 {
104 	void *data = ldb_module_get_private(module);
105 	struct ldb_kv_private *ldb_kv =
106 	    talloc_get_type(data, struct ldb_kv_private);
107 	pid_t pid = getpid();
108 
109 	if (ldb_kv->pid != pid) {
110 		ldb_asprintf_errstring(ldb_module_get_ctx(module),
111 				       __location__
112 				       ": Reusing ldb opend by pid %d in "
113 				       "process %d\n",
114 				       ldb_kv->pid,
115 				       pid);
116 		return LDB_ERR_PROTOCOL_ERROR;
117 	}
118 	if (!tdb_transaction_active(ldb_kv->tdb) &&
119 	    ldb_kv->read_lock_count == 1) {
120 		tdb_unlockall_read(ldb_kv->tdb);
121 		ldb_kv->read_lock_count--;
122 		return 0;
123 	}
124 	ldb_kv->read_lock_count--;
125 	return 0;
126 }
127 
ltdb_store(struct ldb_kv_private * ldb_kv,struct ldb_val ldb_key,struct ldb_val ldb_data,int flags)128 static int ltdb_store(struct ldb_kv_private *ldb_kv,
129 		      struct ldb_val ldb_key,
130 		      struct ldb_val ldb_data,
131 		      int flags)
132 {
133 	TDB_DATA key = {
134 		.dptr = ldb_key.data,
135 		.dsize = ldb_key.length
136 	};
137 	TDB_DATA data = {
138 		.dptr = ldb_data.data,
139 		.dsize = ldb_data.length
140 	};
141 	bool transaction_active = tdb_transaction_active(ldb_kv->tdb);
142 	if (transaction_active == false){
143 		return LDB_ERR_PROTOCOL_ERROR;
144 	}
145 	return tdb_store(ldb_kv->tdb, key, data, flags);
146 }
147 
ltdb_error(struct ldb_kv_private * ldb_kv)148 static int ltdb_error(struct ldb_kv_private *ldb_kv)
149 {
150 	return ltdb_err_map(tdb_error(ldb_kv->tdb));
151 }
152 
ltdb_errorstr(struct ldb_kv_private * ldb_kv)153 static const char *ltdb_errorstr(struct ldb_kv_private *ldb_kv)
154 {
155 	return tdb_errorstr(ldb_kv->tdb);
156 }
157 
ltdb_delete(struct ldb_kv_private * ldb_kv,struct ldb_val ldb_key)158 static int ltdb_delete(struct ldb_kv_private *ldb_kv, struct ldb_val ldb_key)
159 {
160 	TDB_DATA tdb_key = {
161 		.dptr = ldb_key.data,
162 		.dsize = ldb_key.length
163 	};
164 	bool transaction_active = tdb_transaction_active(ldb_kv->tdb);
165 	if (transaction_active == false){
166 		return LDB_ERR_PROTOCOL_ERROR;
167 	}
168 	return tdb_delete(ldb_kv->tdb, tdb_key);
169 }
170 
ltdb_transaction_start(struct ldb_kv_private * ldb_kv)171 static int ltdb_transaction_start(struct ldb_kv_private *ldb_kv)
172 {
173 	pid_t pid = getpid();
174 
175 	if (ldb_kv->pid != pid) {
176 		ldb_asprintf_errstring(ldb_module_get_ctx(ldb_kv->module),
177 				       __location__
178 				       ": Reusing ldb opend by pid %d in "
179 				       "process %d\n",
180 				       ldb_kv->pid,
181 				       pid);
182 		return LDB_ERR_PROTOCOL_ERROR;
183 	}
184 
185 	return tdb_transaction_start(ldb_kv->tdb);
186 }
187 
ltdb_transaction_cancel(struct ldb_kv_private * ldb_kv)188 static int ltdb_transaction_cancel(struct ldb_kv_private *ldb_kv)
189 {
190 	pid_t pid = getpid();
191 
192 	if (ldb_kv->pid != pid) {
193 		ldb_asprintf_errstring(ldb_module_get_ctx(ldb_kv->module),
194 				       __location__
195 				       ": Reusing ldb opend by pid %d in "
196 				       "process %d\n",
197 				       ldb_kv->pid,
198 				       pid);
199 		return LDB_ERR_PROTOCOL_ERROR;
200 	}
201 
202 	return tdb_transaction_cancel(ldb_kv->tdb);
203 }
204 
ltdb_transaction_prepare_commit(struct ldb_kv_private * ldb_kv)205 static int ltdb_transaction_prepare_commit(struct ldb_kv_private *ldb_kv)
206 {
207 	pid_t pid = getpid();
208 
209 	if (ldb_kv->pid != pid) {
210 		ldb_asprintf_errstring(ldb_module_get_ctx(ldb_kv->module),
211 				       __location__
212 				       ": Reusing ldb opend by pid %d in "
213 				       "process %d\n",
214 				       ldb_kv->pid,
215 				       pid);
216 		return LDB_ERR_PROTOCOL_ERROR;
217 	}
218 
219 	return tdb_transaction_prepare_commit(ldb_kv->tdb);
220 }
221 
ltdb_transaction_commit(struct ldb_kv_private * ldb_kv)222 static int ltdb_transaction_commit(struct ldb_kv_private *ldb_kv)
223 {
224 	pid_t pid = getpid();
225 
226 	if (ldb_kv->pid != pid) {
227 		ldb_asprintf_errstring(ldb_module_get_ctx(ldb_kv->module),
228 				       __location__
229 				       ": Reusing ldb opend by pid %d in "
230 				       "process %d\n",
231 				       ldb_kv->pid,
232 				       pid);
233 		return LDB_ERR_PROTOCOL_ERROR;
234 	}
235 
236 	return tdb_transaction_commit(ldb_kv->tdb);
237 }
238 struct kv_ctx {
239 	ldb_kv_traverse_fn kv_traverse_fn;
240 	void *ctx;
241 	struct ldb_kv_private *ldb_kv;
242 	int (*parser)(struct ldb_val key,
243 		      struct ldb_val data,
244 		      void *private_data);
245 	int parser_ret;
246 };
247 
ltdb_traverse_fn_wrapper(struct tdb_context * tdb,TDB_DATA tdb_key,TDB_DATA tdb_data,void * ctx)248 static int ltdb_traverse_fn_wrapper(struct tdb_context *tdb,
249 				    TDB_DATA tdb_key,
250 				    TDB_DATA tdb_data,
251 				    void *ctx)
252 {
253 	struct kv_ctx *kv_ctx = ctx;
254 	struct ldb_val key = {
255 		.length = tdb_key.dsize,
256 		.data = tdb_key.dptr,
257 	};
258 	struct ldb_val data = {
259 		.length = tdb_data.dsize,
260 		.data = tdb_data.dptr,
261 	};
262 	return kv_ctx->kv_traverse_fn(kv_ctx->ldb_kv, key, data, kv_ctx->ctx);
263 }
264 
ltdb_traverse_fn(struct ldb_kv_private * ldb_kv,ldb_kv_traverse_fn fn,void * ctx)265 static int ltdb_traverse_fn(struct ldb_kv_private *ldb_kv,
266 			    ldb_kv_traverse_fn fn,
267 			    void *ctx)
268 {
269 	struct kv_ctx kv_ctx = {
270 	    .kv_traverse_fn = fn, .ctx = ctx, .ldb_kv = ldb_kv};
271 	if (tdb_transaction_active(ldb_kv->tdb)) {
272 		return tdb_traverse(
273 		    ldb_kv->tdb, ltdb_traverse_fn_wrapper, &kv_ctx);
274 	} else {
275 		return tdb_traverse_read(
276 		    ldb_kv->tdb, ltdb_traverse_fn_wrapper, &kv_ctx);
277 	}
278 }
279 
ltdb_update_in_iterate(struct ldb_kv_private * ldb_kv,struct ldb_val ldb_key,struct ldb_val ldb_key2,struct ldb_val ldb_data,void * state)280 static int ltdb_update_in_iterate(struct ldb_kv_private *ldb_kv,
281 				  struct ldb_val ldb_key,
282 				  struct ldb_val ldb_key2,
283 				  struct ldb_val ldb_data,
284 				  void *state)
285 {
286 	int tdb_ret;
287 	struct ldb_context *ldb;
288 	struct ldb_kv_reindex_context *ctx =
289 	    (struct ldb_kv_reindex_context *)state;
290 	struct ldb_module *module = ldb_kv->module;
291 	TDB_DATA key = {
292 		.dptr = ldb_key.data,
293 		.dsize = ldb_key.length
294 	};
295 	TDB_DATA key2 = {
296 		.dptr = ldb_key2.data,
297 		.dsize = ldb_key2.length
298 	};
299 	TDB_DATA data = {
300 		.dptr = ldb_data.data,
301 		.dsize = ldb_data.length
302 	};
303 
304 	ldb = ldb_module_get_ctx(module);
305 
306 	tdb_ret = tdb_delete(ldb_kv->tdb, key);
307 	if (tdb_ret != 0) {
308 		ldb_debug(ldb,
309 			  LDB_DEBUG_ERROR,
310 			  "Failed to delete %*.*s "
311 			  "for rekey as %*.*s: %s",
312 			  (int)key.dsize,
313 			  (int)key.dsize,
314 			  (const char *)key.dptr,
315 			  (int)key2.dsize,
316 			  (int)key2.dsize,
317 			  (const char *)key.dptr,
318 			  tdb_errorstr(ldb_kv->tdb));
319 		ctx->error = ltdb_err_map(tdb_error(ldb_kv->tdb));
320 		return -1;
321 	}
322 	tdb_ret = tdb_store(ldb_kv->tdb, key2, data, 0);
323 	if (tdb_ret != 0) {
324 		ldb_debug(ldb,
325 			  LDB_DEBUG_ERROR,
326 			  "Failed to rekey %*.*s as %*.*s: %s",
327 			  (int)key.dsize,
328 			  (int)key.dsize,
329 			  (const char *)key.dptr,
330 			  (int)key2.dsize,
331 			  (int)key2.dsize,
332 			  (const char *)key.dptr,
333 			  tdb_errorstr(ldb_kv->tdb));
334 		ctx->error = ltdb_err_map(tdb_error(ldb_kv->tdb));
335 		return -1;
336 	}
337 	return tdb_ret;
338 }
339 
ltdb_parse_record_wrapper(TDB_DATA tdb_key,TDB_DATA tdb_data,void * ctx)340 static int ltdb_parse_record_wrapper(TDB_DATA tdb_key,
341 				     TDB_DATA tdb_data,
342 				     void *ctx)
343 {
344 	struct kv_ctx *kv_ctx = ctx;
345 	struct ldb_val key = {
346 		.length = tdb_key.dsize,
347 		.data = tdb_key.dptr,
348 	};
349 	struct ldb_val data = {
350 		.length = tdb_data.dsize,
351 		.data = tdb_data.dptr,
352 	};
353 
354 	kv_ctx->parser_ret = kv_ctx->parser(key, data, kv_ctx->ctx);
355 	return kv_ctx->parser_ret;
356 }
357 
ltdb_parse_record(struct ldb_kv_private * ldb_kv,struct ldb_val ldb_key,int (* parser)(struct ldb_val key,struct ldb_val data,void * private_data),void * ctx)358 static int ltdb_parse_record(struct ldb_kv_private *ldb_kv,
359 			     struct ldb_val ldb_key,
360 			     int (*parser)(struct ldb_val key,
361 					   struct ldb_val data,
362 					   void *private_data),
363 			     void *ctx)
364 {
365 	struct kv_ctx kv_ctx = {.parser = parser, .ctx = ctx, .ldb_kv = ldb_kv};
366 	TDB_DATA key = {
367 		.dptr = ldb_key.data,
368 		.dsize = ldb_key.length
369 	};
370 	int ret;
371 
372 	if (tdb_transaction_active(ldb_kv->tdb) == false &&
373 	    ldb_kv->read_lock_count == 0) {
374 		return LDB_ERR_PROTOCOL_ERROR;
375 	}
376 
377 	ret = tdb_parse_record(
378 	    ldb_kv->tdb, key, ltdb_parse_record_wrapper, &kv_ctx);
379 	if (kv_ctx.parser_ret != LDB_SUCCESS) {
380 		return kv_ctx.parser_ret;
381 	} else if (ret == 0) {
382 		return LDB_SUCCESS;
383 	}
384 	return ltdb_err_map(tdb_error(ldb_kv->tdb));
385 }
386 
ltdb_iterate_range(struct ldb_kv_private * ldb_kv,struct ldb_val start_key,struct ldb_val end_key,ldb_kv_traverse_fn fn,void * ctx)387 static int ltdb_iterate_range(struct ldb_kv_private *ldb_kv,
388 			      struct ldb_val start_key,
389 			      struct ldb_val end_key,
390 			      ldb_kv_traverse_fn fn,
391 			      void *ctx)
392 {
393 	/*
394 	 * We do not implement this operation because we do not know how to
395 	 * iterate from one key to the next (in a sorted fashion).
396 	 *
397 	 * We could mimic it potentially, but it would violate boundaries of
398 	 * knowledge (data type representation).
399 	 */
400 	return LDB_ERR_OPERATIONS_ERROR;
401 }
402 
ltdb_name(struct ldb_kv_private * ldb_kv)403 static const char *ltdb_name(struct ldb_kv_private *ldb_kv)
404 {
405 	return tdb_name(ldb_kv->tdb);
406 }
407 
ltdb_changed(struct ldb_kv_private * ldb_kv)408 static bool ltdb_changed(struct ldb_kv_private *ldb_kv)
409 {
410 	int seq = tdb_get_seqnum(ldb_kv->tdb);
411 	bool has_changed = (seq != ldb_kv->tdb_seqnum);
412 
413 	ldb_kv->tdb_seqnum = seq;
414 
415 	return has_changed;
416 }
417 
ltdb_transaction_active(struct ldb_kv_private * ldb_kv)418 static bool ltdb_transaction_active(struct ldb_kv_private *ldb_kv)
419 {
420 	return tdb_transaction_active(ldb_kv->tdb);
421 }
422 
423 /*
424  * Get an estimate of the number of records in a tdb database.
425  *
426  * This implementation will overestimate the number of records in a sparsely
427  * populated database. The size estimate is only used for allocating
428  * an in memory tdb to cache index records during a reindex, overestimating
429  * the contents is acceptable, and preferable to underestimating
430  */
431 #define RECORD_SIZE 500
ltdb_get_size(struct ldb_kv_private * ldb_kv)432 static size_t ltdb_get_size(struct ldb_kv_private *ldb_kv)
433 {
434 	size_t map_size = tdb_map_size(ldb_kv->tdb);
435 	size_t size = map_size / RECORD_SIZE;
436 
437 	return size;
438 }
439 
440 /*
441  * Start a sub transaction
442  * As TDB does not currently support nested transactions, we do nothing and
443  * return LDB_SUCCESS
444  */
ltdb_nested_transaction_start(struct ldb_kv_private * ldb_kv)445 static int ltdb_nested_transaction_start(struct ldb_kv_private *ldb_kv)
446 {
447 	return LDB_SUCCESS;
448 }
449 
450 /*
451  * Commit a sub transaction
452  * As TDB does not currently support nested transactions, we do nothing and
453  * return LDB_SUCCESS
454  */
ltdb_nested_transaction_commit(struct ldb_kv_private * ldb_kv)455 static int ltdb_nested_transaction_commit(struct ldb_kv_private *ldb_kv)
456 {
457 	return LDB_SUCCESS;
458 }
459 
460 /*
461  * Cancel a sub transaction
462  * As TDB does not currently support nested transactions, we do nothing and
463  * return LDB_SUCCESS
464  */
ltdb_nested_transaction_cancel(struct ldb_kv_private * ldb_kv)465 static int ltdb_nested_transaction_cancel(struct ldb_kv_private *ldb_kv)
466 {
467 	return LDB_SUCCESS;
468 }
469 
470 static const struct kv_db_ops key_value_ops = {
471 	/* No support for any additional features */
472 	.options = 0,
473 
474 	.store = ltdb_store,
475 	.delete = ltdb_delete,
476 	.iterate = ltdb_traverse_fn,
477 	.update_in_iterate = ltdb_update_in_iterate,
478 	.fetch_and_parse = ltdb_parse_record,
479 	.iterate_range = ltdb_iterate_range,
480 	.lock_read = ltdb_lock_read,
481 	.unlock_read = ltdb_unlock_read,
482 	.begin_write = ltdb_transaction_start,
483 	.prepare_write = ltdb_transaction_prepare_commit,
484 	.finish_write = ltdb_transaction_commit,
485 	.abort_write = ltdb_transaction_cancel,
486 	.error = ltdb_error,
487 	.errorstr = ltdb_errorstr,
488 	.name = ltdb_name,
489 	.has_changed = ltdb_changed,
490 	.transaction_active = ltdb_transaction_active,
491 	.get_size = ltdb_get_size,
492 	.begin_nested_write = ltdb_nested_transaction_start,
493 	.finish_nested_write = ltdb_nested_transaction_commit,
494 	.abort_nested_write = ltdb_nested_transaction_cancel,
495 };
496 
497 /*
498   connect to the database
499 */
ltdb_connect(struct ldb_context * ldb,const char * url,unsigned int flags,const char * options[],struct ldb_module ** _module)500 int ltdb_connect(struct ldb_context *ldb, const char *url,
501 		 unsigned int flags, const char *options[],
502 		 struct ldb_module **_module)
503 {
504 	const char *path;
505 	int tdb_flags, open_flags;
506 	struct ldb_kv_private *ldb_kv;
507 
508 	/*
509 	 * We hold locks, so we must use a private event context
510 	 * on each returned handle
511 	 */
512 	ldb_set_require_private_event_context(ldb);
513 
514 	/* parse the url */
515 	if (strchr(url, ':')) {
516 		if (strncmp(url, "tdb://", 6) != 0) {
517 			ldb_debug(ldb, LDB_DEBUG_ERROR,
518 				  "Invalid tdb URL '%s'", url);
519 			return LDB_ERR_OPERATIONS_ERROR;
520 		}
521 		path = url+6;
522 	} else {
523 		path = url;
524 	}
525 
526 	tdb_flags = TDB_DEFAULT | TDB_SEQNUM | TDB_DISALLOW_NESTING;
527 
528 	/* check for the 'nosync' option */
529 	if (flags & LDB_FLG_NOSYNC) {
530 		tdb_flags |= TDB_NOSYNC;
531 	}
532 
533 	/* and nommap option */
534 	if (flags & LDB_FLG_NOMMAP) {
535 		tdb_flags |= TDB_NOMMAP;
536 	}
537 
538 	ldb_kv = talloc_zero(ldb, struct ldb_kv_private);
539 	if (!ldb_kv) {
540 		ldb_oom(ldb);
541 		return LDB_ERR_OPERATIONS_ERROR;
542 	}
543 
544 	if (flags & LDB_FLG_RDONLY) {
545 		/*
546 		 * This is weird, but because we can only have one tdb
547 		 * in this process, and the other one could be
548 		 * read-write, we can't use the tdb readonly.  Plus a
549 		 * read only tdb prohibits the all-record lock.
550 		 */
551 		open_flags = O_RDWR;
552 
553 		ldb_kv->read_only = true;
554 
555 	} else if (flags & LDB_FLG_DONT_CREATE_DB) {
556 		/*
557 		 * This is used by ldbsearch to prevent creation of the database
558 		 * if the name is wrong
559 		 */
560 		open_flags = O_RDWR;
561 	} else {
562 		/*
563 		 * This is the normal case
564 		 */
565 		open_flags = O_CREAT | O_RDWR;
566 	}
567 
568 	ldb_kv->kv_ops = &key_value_ops;
569 
570 	errno = 0;
571 	/* note that we use quite a large default hash size */
572 	ldb_kv->tdb = ltdb_wrap_open(ldb_kv,
573 				     path,
574 				     10000,
575 				     tdb_flags,
576 				     open_flags,
577 				     ldb_get_create_perms(ldb),
578 				     ldb);
579 	if (!ldb_kv->tdb) {
580 		ldb_asprintf_errstring(ldb,
581 				       "Unable to open tdb '%s': %s", path, strerror(errno));
582 		ldb_debug(ldb, LDB_DEBUG_ERROR,
583 			  "Unable to open tdb '%s': %s", path, strerror(errno));
584 		talloc_free(ldb_kv);
585 		if (errno == EACCES || errno == EPERM) {
586 			return LDB_ERR_INSUFFICIENT_ACCESS_RIGHTS;
587 		}
588 		return LDB_ERR_OPERATIONS_ERROR;
589 	}
590 
591 	return ldb_kv_init_store(
592 	    ldb_kv, "ldb_tdb backend", ldb, options, _module);
593 }
594