aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/SPMySQLFramework/Source
diff options
context:
space:
mode:
authorMax <post@wickenrode.com>2018-02-25 18:38:02 +0100
committerMax <post@wickenrode.com>2018-02-25 18:38:02 +0100
commit219d049c61d5588e5519171bd149fb2aa91351f3 (patch)
treee0eb1428d78952bfcfbe20fed70156b722d47bec /Frameworks/SPMySQLFramework/Source
parent030eac5e17c69e375d7724e489483db72e791b9c (diff)
downloadsequelpro-219d049c61d5588e5519171bd149fb2aa91351f3.tar.gz
sequelpro-219d049c61d5588e5519171bd149fb2aa91351f3.tar.bz2
sequelpro-219d049c61d5588e5519171bd149fb2aa91351f3.zip
Move utility function ot a different file
Diffstat (limited to 'Frameworks/SPMySQLFramework/Source')
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m31
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h12
-rw-r--r--Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.m66
3 files changed, 79 insertions, 30 deletions
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m
index b143db19..d4146f58 100644
--- a/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m
+++ b/Frameworks/SPMySQLFramework/Source/SPMySQLConnection.m
@@ -34,10 +34,7 @@
#include <pthread.h>
#include <SystemConfiguration/SCNetworkReachability.h>
#include <errno.h>
-#define __STDC_WANT_LIB_EXT1__ 1
#include <string.h>
-#include <stdlib.h>
-#include <dlfcn.h>
#import "SPMySQLUtilities.h"
// Thread flag constant
@@ -56,7 +53,6 @@ const SPMySQLClientFlags SPMySQLConnectionOptions =
const char *SPMySQLSSLPermissibleCiphers = "DHE-RSA-AES256-SHA:AES256-SHA:DHE-RSA-AES128-SHA:AES128-SHA:AES256-RMD:AES128-RMD:DES-CBC3-RMD:DHE-RSA-AES256-RMD:DHE-RSA-AES128-RMD:DHE-RSA-DES-CBC3-RMD:RC4-SHA:RC4-MD5:DES-CBC3-SHA:DES-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC-SHA";
static void PasswordCallback(MYSQL *mysql, const char *plugin, void (^with_password)(const char *passwd));
-static errno_t LegacyMemsetS(void *ptr, rsize_t ignored, int value, rsize_t count);
@implementation SPMySQLConnection
@@ -792,16 +788,8 @@ asm(".desc ___crashreporter_info__, 0x10");
else {
NSLog(@"%s: -getCString:maxLength:encoding: failed for password!", __PRETTY_FUNCTION__);
}
-
- // memset_s is 10.9+ only - if we added a link time dependency, SP wouldn't launch on older targets
- static errno_t (*memsetPtr)(void *, rsize_t, int, rsize_t);
- static dispatch_once_t findMemsetToken;
- dispatch_once(&findMemsetToken, ^{
- memsetPtr = dlsym(RTLD_DEFAULT, "memset_s");
- if(!memsetPtr) memsetPtr = LegacyMemsetS;
- });
-
- memsetPtr(cBuffer, cLength, '\0', cLength); //clear password from memory
+
+ SPMySQLSafeEraseMemory(cBuffer, cLength); //clear password from memory
free(cBuffer);
}
@@ -1240,18 +1228,3 @@ void PasswordCallback(MYSQL *mysql, const char *plugin, void (^with_password)(co
assert(mysql && mysql->sp_context);
[(SPMySQLConnection *)mysql->sp_context _mysqlConnection:mysql wantsPassword:with_password withPlugin:plugin];
}
-
-/**
- * This function tries to emulate the important (to us) parts
- * of memset_s on pre 10.9 systems.
- *
- * The implementation is taken from the original memset_s proposal:
- * http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf
- */
-errno_t LegacyMemsetS(void *s, rsize_t smax __attribute__((unused)), int c, rsize_t n)
-{
- volatile unsigned char * addr = (volatile unsigned char *)s;
- while(n--) *addr++ = (unsigned char)c;
-
- return 0;
-}
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h
index 50f9d504..852ca685 100644
--- a/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h
+++ b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.h
@@ -1,5 +1,5 @@
//
-// Locking.h
+// SPMySQLUtilities.h
// SPMySQLFramework
//
// Created by Rowan Beentje (rowan.beent.je) on February 6, 2012
@@ -30,6 +30,16 @@
#include <mach/mach_time.h>
+/**
+ * This function provides a memset() variant that cannot be optimized
+ * away by a compiler's dead store optimization.
+ *
+ * It will write cLength '\0' bytes to the buffer pointed to by cBuffer.
+ *
+ * @return See the documentation for memset_s in libc
+ */
+errno_t SPMySQLSafeEraseMemory(void *cBuffer, size_t cLength);
+
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
diff --git a/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.m b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.m
new file mode 100644
index 00000000..3d147143
--- /dev/null
+++ b/Frameworks/SPMySQLFramework/Source/SPMySQLUtilities.m
@@ -0,0 +1,66 @@
+//
+// SPMySQLUtilities.c
+// SPMySQLFramework
+//
+// Created by Max Lohrmann on 25.02.2018
+// Copyright (c) 2018 Max Lohrmann. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// More info at <https://github.com/sequelpro/sequelpro>
+
+#include <errno.h>
+#define __STDC_WANT_LIB_EXT1__ 1
+#include <string.h>
+#include <dlfcn.h>
+#include <dispatch/dispatch.h>
+
+#include "SPMySQLUtilities.h"
+
+static errno_t LegacyMemsetS(void *ptr, rsize_t ignored, int value, rsize_t count);
+
+errno_t SPMySQLSafeEraseMemory(void *cBuffer, size_t cLength) {
+ // memset_s is 10.9+ only - if we added a link time dependency, SP wouldn't launch on older targets
+ static errno_t (*memsetPtr)(void *, rsize_t, int, rsize_t);
+ static dispatch_once_t findMemsetToken;
+ dispatch_once(&findMemsetToken, ^{
+ memsetPtr = dlsym(RTLD_DEFAULT, "memset_s");
+ if(!memsetPtr) memsetPtr = &LegacyMemsetS;
+ });
+
+ return (*memsetPtr)(cBuffer, cLength, '\0', cLength);
+}
+
+/**
+ * This function tries to emulate the important (to us) parts
+ * of memset_s on pre 10.9 systems.
+ *
+ * The implementation is taken from the original memset_s proposal:
+ * http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1381.pdf
+ */
+errno_t LegacyMemsetS(void *s, rsize_t smax __attribute__((unused)), int c, rsize_t n)
+{
+ volatile unsigned char * addr = (volatile unsigned char *)s;
+ while(n--) *addr++ = (unsigned char)c;
+
+ return 0;
+}