summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelen <jjelen@redhat.com>2021-08-03 16:30:46 +0200
committerJakub Jelen <jjelen@redhat.com>2021-08-04 08:44:34 +0200
commita37e7bb2b00131b87124c1895a6525ea6eb52516 (patch)
tree4db1856e32eb41f3b01006cea8e2733ca29d2afa
parentcf6121deb47e437aa566cfeb29a03da93c432394 (diff)
Use g_memdup2 if available and fallback if not
-rw-r--r--configure.ac9
-rw-r--r--meson.build12
-rw-r--r--src/cac.c2
-rw-r--r--src/card_7816.c2
-rw-r--r--src/common.h6
-rw-r--r--src/simpletlv.c4
-rw-r--r--src/vcard.c5
-rw-r--r--src/vcard_emul_nss.c5
-rw-r--r--src/vscclient.c2
9 files changed, 34 insertions, 13 deletions
diff --git a/configure.ac b/configure.ac
index 0995737..b7d2c42 100644
--- a/configure.ac
+++ b/configure.ac
@@ -33,9 +33,16 @@ PKG_PROG_PKG_CONFIG
AX_COMPILER_FLAGS([WARN_CFLAGS],[WARN_LDFLAGS])
AX_CODE_COVERAGE()
-PKG_CHECK_MODULES(GLIB2, [glib-2.0 >= 2.32])
PKG_CHECK_MODULES(CACARD, [nss >= 3.12.8])
+PKG_CHECK_MODULES(GLIB2, glib-2.0 >= 2.68, [
+ AC_DEFINE_UNQUOTED(HAVE_G_MEMDUP2, 1,
+ [Define to 1 if you have the 'g_memdup2' function.])
+], [
+ PKG_CHECK_MODULES(GLIB2, glib-2.0 >= 2.32,,
+ AC_MSG_ERROR(GLib >= 2.32 is required))
+])
+
dnl === --enable-pcsc ==========================================================
AC_ARG_ENABLE([pcsc],
diff --git a/meson.build b/meson.build
index 9cfe248..19d440a 100644
--- a/meson.build
+++ b/meson.build
@@ -12,6 +12,13 @@ cxx = meson.get_compiler('cpp')
static_dep = (get_option('default_library') == 'static')
glib_dep = dependency('glib-2.0', version: '>= 2.32', static: static_dep)
+
+core_conf = configuration_data()
+if glib_dep.version().version_compare('>= 2.68')
+ core_conf.set('HAVE_G_MEMDUP2', 1)
+endif
+
+
nss_dep = dependency('nss', version: '>= 3.12.8', static: static_dep)
pcsc_dep = dependency('libpcsclite', required: get_option('pcsc'))
@@ -52,6 +59,7 @@ libcacard_src = [
if pcsc_dep.found()
libcacard_src += 'src/capcsc.c'
+ core_conf.set('ENABLE_PCSC', 1)
endif
mapfile = 'src/libcacard.map'
@@ -77,9 +85,7 @@ executable('vscclient', 'src/vscclient.c', dependencies: [libcacard_dep])
configure_file(
output: 'config.h',
- configuration: {
- 'ENABLE_PCSC': pcsc_dep.found(),
- },
+ configuration: core_conf,
)
pc = import('pkgconfig')
diff --git a/src/cac.c b/src/cac.c
index 497c32d..1400e8a 100644
--- a/src/cac.c
+++ b/src/cac.c
@@ -1972,7 +1972,7 @@ cac_new_empty_applet_private(unsigned char objects[][2], unsigned int objects_le
/* Create Object ID list */
if (objects_len > 0) {
- applet_private->coids = g_memdup(objects, sizeof(struct coid) * objects_len);
+ applet_private->coids = g_memdup2(objects, sizeof(struct coid) * objects_len);
applet_private->coids_len = objects_len;
}
diff --git a/src/card_7816.c b/src/card_7816.c
index bf481f0..9cb77e5 100644
--- a/src/card_7816.c
+++ b/src/card_7816.c
@@ -352,7 +352,7 @@ vcard_apdu_new(unsigned char *raw_apdu, int len, vcard_7816_status_t *status)
}
new_apdu = g_new(VCardAPDU, 1);
- new_apdu->a_data = g_memdup(raw_apdu, len);
+ new_apdu->a_data = g_memdup2(raw_apdu, len);
new_apdu->a_len = len;
*status = vcard_apdu_set_class(new_apdu);
if (*status != VCARD7816_STATUS_SUCCESS) {
diff --git a/src/common.h b/src/common.h
index 5210367..d513edc 100644
--- a/src/common.h
+++ b/src/common.h
@@ -26,9 +26,15 @@
#include <stddef.h>
+#include "config.h"
+
unsigned char *ushort2lebytes(unsigned char *buf, unsigned short x);
unsigned short lebytes2ushort(const unsigned char *buf);
char *hex_dump(const unsigned char *buf, size_t buflen);
+#ifndef HAVE_G_MEMDUP2
+#define g_memdup2(ptr,sz) ((G_LIKELY(((guint64)(sz)) < G_MAXUINT)) ? g_memdup(ptr,sz) : (g_abort(), NULL))
+#endif
+
#endif
diff --git a/src/simpletlv.c b/src/simpletlv.c
index c0e38a0..bc2b91d 100644
--- a/src/simpletlv.c
+++ b/src/simpletlv.c
@@ -292,7 +292,7 @@ simpletlv_clone(struct simpletlv_member *tlv, size_t tlvlen)
if (new[i].value.child == NULL)
goto failure;
} else {
- new[i].value.value = g_memdup(tlv[i].value.value, tlv[i].length);
+ new[i].value.value = g_memdup2(tlv[i].value.value, tlv[i].length);
}
}
return new;
@@ -332,7 +332,7 @@ simpletlv_parse(unsigned char *data, size_t data_len, size_t *outtlv_len)
tlvp.tag = tag;
tlvp.length = vlen;
- tlvp.value.value = g_memdup(p, vlen);
+ tlvp.value.value = g_memdup2(p, vlen);
tlvp.type = SIMPLETLV_TYPE_LEAF;
g_array_append_val(tlv, tlvp);
diff --git a/src/vcard.c b/src/vcard.c
index 9a87575..fda6cd1 100644
--- a/src/vcard.c
+++ b/src/vcard.c
@@ -12,6 +12,7 @@
#include "vcard.h"
#include "vcard_emul.h"
#include "card_7816t.h"
+#include "common.h"
struct VCardAppletStruct {
VCardApplet *next;
@@ -43,7 +44,7 @@ vcard_buffer_response_new(const unsigned char *buffer, int size)
VCardBufferResponse *new_buffer;
new_buffer = g_new(VCardBufferResponse, 1);
- new_buffer->buffer = (unsigned char *)g_memdup(buffer, size);
+ new_buffer->buffer = (unsigned char *)g_memdup2(buffer, size);
new_buffer->buffer_len = size;
new_buffer->current = new_buffer->buffer;
new_buffer->len = size;
@@ -108,7 +109,7 @@ vcard_new_applet(VCardProcessAPDU applet_process_function,
applet->process_apdu = applet_process_function;
applet->reset_applet = applet_reset_function;
- applet->aid = g_memdup(aid, aid_len);
+ applet->aid = g_memdup2(aid, aid_len);
applet->aid_len = aid_len;
return applet;
}
diff --git a/src/vcard_emul_nss.c b/src/vcard_emul_nss.c
index 1f922c5..289a60a 100644
--- a/src/vcard_emul_nss.c
+++ b/src/vcard_emul_nss.c
@@ -9,10 +9,11 @@
* This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
* See the COPYING file in the top-level directory.
*/
-#include "config.h"
#include <glib.h>
+#include "common.h"
+
/*
* NSS headers
*/
@@ -1470,7 +1471,7 @@ vcard_emul_read_object(VCard *card, const char *label,
return NULL;
*ret_len = result.len;
- ret = g_memdup(result.data, result.len);
+ ret = g_memdup2(result.data, result.len);
PORT_Free(result.data);
return ret;
}
diff --git a/src/vscclient.c b/src/vscclient.c
index 5d1efc2..98cb39a 100644
--- a/src/vscclient.c
+++ b/src/vscclient.c
@@ -466,7 +466,7 @@ do_socket_read(GIOChannel *source,
#if defined(ENABLE_PCSC)
if (with_pcsc) {
reply_size = dwRecvLength;
- reply = g_memdup(pbRecvBuffer, reply_size);
+ reply = g_memdup2(pbRecvBuffer, reply_size);
dwSendLength = mhHeader.length;
dwRecvLength = sizeof(pbRecvBuffer);