]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pyldb: catch potential overflow error in py_timestring
authorStefan Metzmacher <metze@samba.org>
Tue, 19 Jan 2021 15:53:55 +0000 (16:53 +0100)
committerAndrew Bartlett <abartlet@samba.org>
Mon, 1 Mar 2021 03:50:35 +0000 (03:50 +0000)
Pair-Programmed-With: Björn Baumbach <bb@sernet.de>

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Björn Baumbach <bb@sernet.de>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/ldb/common/ldb_msg.c
lib/ldb/pyldb.c
lib/ldb/tests/python/api.py

index 2346e66ec39d8eab0b39693f782342402ce11c1f..0179c35659bdc16a8a6ff3521fb262e6f3728be2 100644 (file)
@@ -1270,6 +1270,7 @@ char *ldb_timestring(TALLOC_CTX *mem_ctx, time_t t)
 
        if (r != 17) {
                talloc_free(ts);
+               errno = EOVERFLOW;
                return NULL;
        }
 
index 813cdb0870eb0f62057e1091c4a33d2e0e1d5016..7802757eb78e56cddcc3c82d4a041d42286c02f0 100644 (file)
@@ -4192,6 +4192,13 @@ static PyObject *py_timestring(PyObject *module, PyObject *args)
        if (!PyArg_ParseTuple(args, "l", &t_val))
                return NULL;
        tresult = ldb_timestring(NULL, (time_t) t_val);
+       if (tresult == NULL) {
+               /*
+                * Most likely EOVERFLOW from gmtime()
+                */
+               PyErr_SetFromErrno(PyExc_OSError);
+               return NULL;
+       }
        ret = PyUnicode_FromString(tresult);
        talloc_free(tresult);
        return ret;
index 5198f3fbbb5a79788c124b649ac1644de09507aa..940c90519329e3dff22fe9a3a8fb7d8a2e51a793 100755 (executable)
@@ -5,10 +5,12 @@
 import os
 from unittest import TestCase
 import sys
+sys.path.insert(0, "bin/python")
 import gc
 import time
 import ldb
 import shutil
+import errno
 
 
 TDB_PREFIX = "tdb://"
@@ -41,10 +43,27 @@ class NoContextTests(TestCase):
         self.assertEqual("19700101000000.0Z", ldb.timestring(0))
         self.assertEqual("20071119191012.0Z", ldb.timestring(1195499412))
 
+        self.assertEqual("00000101000000.0Z", ldb.timestring(-62167219200))
+        self.assertEqual("99991231235959.0Z", ldb.timestring(253402300799))
+
+        # should result with OSError EOVERFLOW from gmtime()
+        with self.assertRaises(OSError) as err:
+            ldb.timestring(-62167219201)
+        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
+        with self.assertRaises(OSError) as err:
+            ldb.timestring(253402300800)
+        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
+        with self.assertRaises(OSError) as err:
+            ldb.timestring(0x7fffffffffffffff)
+        self.assertEqual(err.exception.errno, errno.EOVERFLOW)
+
     def test_string_to_time(self):
         self.assertEqual(0, ldb.string_to_time("19700101000000.0Z"))
         self.assertEqual(1195499412, ldb.string_to_time("20071119191012.0Z"))
 
+        self.assertEqual(-62167219200, ldb.string_to_time("00000101000000.0Z"))
+        self.assertEqual(253402300799, ldb.string_to_time("99991231235959.0Z"))
+
     def test_binary_encode(self):
         encoded = ldb.binary_encode(b'test\\x')
         decoded = ldb.binary_decode(encoded)