Fixes for bugs reported by Coverity:
- update bad bit shift patch with one that patches getcifsacl.c too - remove some dead code from getcifsacl.c, asn1.c, and data_blob.c - fix bad handling of allocated memory in del_mtab in mount.cifs.c Signed-off-by: Jeff Layton <jlayton@redhat.com>
This commit is contained in:
parent
c674873660
commit
e220fa3cd8
@ -1,7 +1,7 @@
|
||||
From 163dc5ba93cae1cc81b709a05d8979d6b11cf04d Mon Sep 17 00:00:00 2001
|
||||
From 99d2a5a4517216a63cfdeef3ee30656938b3a98e Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Layton <jlayton@samba.org>
|
||||
Date: Tue, 8 Oct 2013 21:07:24 -0400
|
||||
Subject: [PATCH] setcifsacl: fix bad bit-shift in raw_str_to_sid
|
||||
Subject: [PATCH] get/setcifsacl: fix bad bit-shifts
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
@ -10,13 +10,28 @@ A Coverity scan turned up this warning:
|
||||
|
||||
1. cifs-utils-6.2/setcifsacl.c:578:result_independent_of_operands – "(x & 0xff0000000000ULL) >> 48" is 0 regardless of the values of its operands. This occurs as the operand of assignment.
|
||||
|
||||
...which is entirely true. That shift should be 40 bits, not 48.
|
||||
...which is entirely true. That shift should be 40 bits, not 48. Also
|
||||
fix a similar bug in getcifsacl.c.
|
||||
|
||||
Signed-off-by: Jeff Layton <jlayton@samba.org>
|
||||
---
|
||||
getcifsacl.c | 2 +-
|
||||
setcifsacl.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/getcifsacl.c b/getcifsacl.c
|
||||
index b8998ef..33f36b4 100644
|
||||
--- a/getcifsacl.c
|
||||
+++ b/getcifsacl.c
|
||||
@@ -198,7 +198,7 @@ print_sid_raw:
|
||||
id_auth_val += (unsigned long long)csid->authority[3] << 16;
|
||||
id_auth_val += (unsigned long long)csid->authority[2] << 24;
|
||||
id_auth_val += (unsigned long long)csid->authority[1] << 32;
|
||||
- id_auth_val += (unsigned long long)csid->authority[0] << 48;
|
||||
+ id_auth_val += (unsigned long long)csid->authority[0] << 40;
|
||||
|
||||
/*
|
||||
* MS-DTYP states that if the authority is >= 2^32, then it should be
|
||||
diff --git a/setcifsacl.c b/setcifsacl.c
|
||||
index ce708eb..7eeeaa6 100644
|
||||
--- a/setcifsacl.c
|
38
0002-getcifsacl-remove-some-dead-code.patch
Normal file
38
0002-getcifsacl-remove-some-dead-code.patch
Normal file
@ -0,0 +1,38 @@
|
||||
From 930b724e784c28bd1b3024f7fc6ca24cdac82a4d Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Layton <jlayton@samba.org>
|
||||
Date: Wed, 9 Oct 2013 08:14:21 -0400
|
||||
Subject: [PATCH] getcifsacl: remove some dead code
|
||||
|
||||
Coverity says:
|
||||
|
||||
Error: DEADCODE (CWE-561): [#def5]
|
||||
cifs-utils-6.2/getcifsacl.c:101: assignment: Assigning: "mflags" = "false".
|
||||
cifs-utils-6.2/getcifsacl.c:109: const: At condition "mflags", the value of "mflags" must be equal to 0.
|
||||
cifs-utils-6.2/getcifsacl.c:109: dead_error_condition: The condition "mflags" cannot be true.
|
||||
cifs-utils-6.2/getcifsacl.c:110: dead_error_line: Execution cannot reach this statement "printf("|");".
|
||||
|
||||
Acked-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
|
||||
Signed-off-by: Jeff Layton <jlayton@samba.org>
|
||||
---
|
||||
getcifsacl.c | 5 +----
|
||||
1 file changed, 1 insertion(+), 4 deletions(-)
|
||||
|
||||
diff --git a/getcifsacl.c b/getcifsacl.c
|
||||
index 33f36b4..f08cdea 100644
|
||||
--- a/getcifsacl.c
|
||||
+++ b/getcifsacl.c
|
||||
@@ -106,10 +106,7 @@ print_ace_flags(uint8_t flags, int raw)
|
||||
}
|
||||
|
||||
if (flags & OBJECT_INHERIT_FLAG) {
|
||||
- if (mflags)
|
||||
- printf("|");
|
||||
- else
|
||||
- mflags = true;
|
||||
+ mflags = true;
|
||||
printf("OI");
|
||||
}
|
||||
if (flags & CONTAINER_INHERIT_FLAG) {
|
||||
--
|
||||
1.8.3.1
|
||||
|
718
0003-asn1-remove-some-usused-functions.patch
Normal file
718
0003-asn1-remove-some-usused-functions.patch
Normal file
@ -0,0 +1,718 @@
|
||||
From e877c21f5e2394c8325955c645f214b8868317c8 Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Layton <jlayton@samba.org>
|
||||
Date: Wed, 9 Oct 2013 08:17:49 -0400
|
||||
Subject: [PATCH] asn1: remove some usused functions
|
||||
|
||||
This cuts 30k out of the cifs.upcall binary on my x86_64 box.
|
||||
|
||||
Signed-off-by: Jeff Layton <jlayton@samba.org>
|
||||
---
|
||||
asn1.c | 638 -----------------------------------------------------------------
|
||||
asn1.h | 37 ----
|
||||
2 files changed, 675 deletions(-)
|
||||
|
||||
diff --git a/asn1.c b/asn1.c
|
||||
index a00c474..ea50a23 100644
|
||||
--- a/asn1.c
|
||||
+++ b/asn1.c
|
||||
@@ -140,83 +140,6 @@ bool asn1_pop_tag(struct asn1_data *data)
|
||||
return true;
|
||||
}
|
||||
|
||||
-/* "i" is the one's complement representation, as is the normal result of an
|
||||
- * implicit signed->unsigned conversion */
|
||||
-
|
||||
-static bool push_int_bigendian(struct asn1_data *data, unsigned int i, bool negative)
|
||||
-{
|
||||
- uint8_t lowest = i & 0xFF;
|
||||
-
|
||||
- i = i >> 8;
|
||||
- if (i != 0)
|
||||
- if (!push_int_bigendian(data, i, negative))
|
||||
- return false;
|
||||
-
|
||||
- if (data->nesting->start+1 == data->ofs) {
|
||||
-
|
||||
- /* We did not write anything yet, looking at the highest
|
||||
- * valued byte */
|
||||
-
|
||||
- if (negative) {
|
||||
- /* Don't write leading 0xff's */
|
||||
- if (lowest == 0xFF)
|
||||
- return true;
|
||||
-
|
||||
- if ((lowest & 0x80) == 0) {
|
||||
- /* The only exception for a leading 0xff is if
|
||||
- * the highest bit is 0, which would indicate
|
||||
- * a positive value */
|
||||
- if (!asn1_write_uint8(data, 0xff))
|
||||
- return false;
|
||||
- }
|
||||
- } else {
|
||||
- if (lowest & 0x80) {
|
||||
- /* The highest bit of a positive integer is 1,
|
||||
- * this would indicate a negative number. Push
|
||||
- * a 0 to indicate a positive one */
|
||||
- if (!asn1_write_uint8(data, 0))
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return asn1_write_uint8(data, lowest);
|
||||
-}
|
||||
-
|
||||
-/* write an Integer without the tag framing. Needed for example for the LDAP
|
||||
- * Abandon Operation */
|
||||
-
|
||||
-bool asn1_write_implicit_Integer(struct asn1_data *data, int i)
|
||||
-{
|
||||
- if (i == -1) {
|
||||
- /* -1 is special as it consists of all-0xff bytes. In
|
||||
- push_int_bigendian this is the only case that is not
|
||||
- properly handled, as all 0xff bytes would be handled as
|
||||
- leading ones to be ignored. */
|
||||
- return asn1_write_uint8(data, 0xff);
|
||||
- } else {
|
||||
- return push_int_bigendian(data, i, i<0);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* write an integer */
|
||||
-bool asn1_write_Integer(struct asn1_data *data, int i)
|
||||
-{
|
||||
- if (!asn1_push_tag(data, ASN1_INTEGER)) return false;
|
||||
- if (!asn1_write_implicit_Integer(data, i)) return false;
|
||||
- return asn1_pop_tag(data);
|
||||
-}
|
||||
-
|
||||
-/* write a BIT STRING */
|
||||
-bool asn1_write_BitString(struct asn1_data *data, const void *p, size_t length, uint8_t padding)
|
||||
-{
|
||||
- if (!asn1_push_tag(data, ASN1_BIT_STRING)) return false;
|
||||
- if (!asn1_write_uint8(data, padding)) return false;
|
||||
- if (!asn1_write(data, p, length)) return false;
|
||||
- return asn1_pop_tag(data);
|
||||
-}
|
||||
-
|
||||
bool ber_write_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char *OID)
|
||||
{
|
||||
unsigned int v, v2;
|
||||
@@ -291,564 +214,3 @@ bool asn1_write_OctetString(struct asn1_data *data, const void *p, size_t length
|
||||
return !data->has_error;
|
||||
}
|
||||
|
||||
-/* write a LDAP string */
|
||||
-bool asn1_write_LDAPString(struct asn1_data *data, const char *s)
|
||||
-{
|
||||
- asn1_write(data, s, strlen(s));
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* write a LDAP string from a DATA_BLOB */
|
||||
-bool asn1_write_DATA_BLOB_LDAPString(struct asn1_data *data, const DATA_BLOB *s)
|
||||
-{
|
||||
- asn1_write(data, s->data, s->length);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* write a general string */
|
||||
-bool asn1_write_GeneralString(struct asn1_data *data, const char *s)
|
||||
-{
|
||||
- asn1_push_tag(data, ASN1_GENERAL_STRING);
|
||||
- asn1_write_LDAPString(data, s);
|
||||
- asn1_pop_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-bool asn1_write_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob)
|
||||
-{
|
||||
- asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(num));
|
||||
- asn1_write(data, blob->data, blob->length);
|
||||
- asn1_pop_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* write a BOOLEAN */
|
||||
-bool asn1_write_BOOLEAN(struct asn1_data *data, bool v)
|
||||
-{
|
||||
- asn1_push_tag(data, ASN1_BOOLEAN);
|
||||
- asn1_write_uint8(data, v ? 0xFF : 0);
|
||||
- asn1_pop_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-bool asn1_read_BOOLEAN(struct asn1_data *data, bool *v)
|
||||
-{
|
||||
- uint8_t tmp = 0;
|
||||
- asn1_start_tag(data, ASN1_BOOLEAN);
|
||||
- asn1_read_uint8(data, &tmp);
|
||||
- if (tmp == 0xFF) {
|
||||
- *v = true;
|
||||
- } else {
|
||||
- *v = false;
|
||||
- }
|
||||
- asn1_end_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* write a BOOLEAN in a simple context */
|
||||
-bool asn1_write_BOOLEAN_context(struct asn1_data *data, bool v, int context)
|
||||
-{
|
||||
- asn1_push_tag(data, ASN1_CONTEXT_SIMPLE(context));
|
||||
- asn1_write_uint8(data, v ? 0xFF : 0);
|
||||
- asn1_pop_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-bool asn1_read_BOOLEAN_context(struct asn1_data *data, bool *v, int context)
|
||||
-{
|
||||
- uint8_t tmp = 0;
|
||||
- asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(context));
|
||||
- asn1_read_uint8(data, &tmp);
|
||||
- if (tmp == 0xFF) {
|
||||
- *v = true;
|
||||
- } else {
|
||||
- *v = false;
|
||||
- }
|
||||
- asn1_end_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* check a BOOLEAN */
|
||||
-bool asn1_check_BOOLEAN(struct asn1_data *data, bool v)
|
||||
-{
|
||||
- uint8_t b = 0;
|
||||
-
|
||||
- asn1_read_uint8(data, &b);
|
||||
- if (b != ASN1_BOOLEAN) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- asn1_read_uint8(data, &b);
|
||||
- if (b != v) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* load a struct asn1_data structure with a lump of data, ready to be parsed */
|
||||
-bool asn1_load(struct asn1_data *data, DATA_BLOB blob)
|
||||
-{
|
||||
- ZERO_STRUCTP(data);
|
||||
- data->data = (uint8_t *)talloc_memdup(data, blob.data, blob.length);
|
||||
- if (!data->data) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- data->length = blob.length;
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* Peek into an ASN1 buffer, not advancing the pointer */
|
||||
-bool asn1_peek(struct asn1_data *data, void *p, int len)
|
||||
-{
|
||||
- if (data->has_error)
|
||||
- return false;
|
||||
-
|
||||
- if (len < 0 || data->ofs + len < data->ofs || data->ofs + len < len)
|
||||
- return false;
|
||||
-
|
||||
- if ((size_t)data->ofs + len > data->length) {
|
||||
- /* we need to mark the buffer as consumed, so the caller knows
|
||||
- this was an out of data error, and not a decode error */
|
||||
- data->ofs = data->length;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- memcpy(p, data->data + data->ofs, len);
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* read from a ASN1 buffer, advancing the buffer pointer */
|
||||
-bool asn1_read(struct asn1_data *data, void *p, int len)
|
||||
-{
|
||||
- if (!asn1_peek(data, p, len)) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- data->ofs += len;
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* read a uint8_t from a ASN1 buffer */
|
||||
-bool asn1_read_uint8(struct asn1_data *data, uint8_t *v)
|
||||
-{
|
||||
- return asn1_read(data, v, 1);
|
||||
-}
|
||||
-
|
||||
-bool asn1_peek_uint8(struct asn1_data *data, uint8_t *v)
|
||||
-{
|
||||
- return asn1_peek(data, v, 1);
|
||||
-}
|
||||
-
|
||||
-bool asn1_peek_tag(struct asn1_data *data, uint8_t tag)
|
||||
-{
|
||||
- uint8_t b;
|
||||
-
|
||||
- if (asn1_tag_remaining(data) <= 0) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if (!asn1_peek_uint8(data, &b))
|
||||
- return false;
|
||||
-
|
||||
- return (b == tag);
|
||||
-}
|
||||
-
|
||||
-/* start reading a nested asn1 structure */
|
||||
-bool asn1_start_tag(struct asn1_data *data, uint8_t tag)
|
||||
-{
|
||||
- uint8_t b;
|
||||
- struct nesting *nesting;
|
||||
-
|
||||
- if (!asn1_read_uint8(data, &b))
|
||||
- return false;
|
||||
-
|
||||
- if (b != tag) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- nesting = talloc(data, struct nesting);
|
||||
- if (!nesting) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if (!asn1_read_uint8(data, &b)) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if (b & 0x80) {
|
||||
- int n = b & 0x7f;
|
||||
- if (!asn1_read_uint8(data, &b))
|
||||
- return false;
|
||||
- nesting->taglen = b;
|
||||
- while (n > 1) {
|
||||
- if (!asn1_read_uint8(data, &b))
|
||||
- return false;
|
||||
- nesting->taglen = (nesting->taglen << 8) | b;
|
||||
- n--;
|
||||
- }
|
||||
- } else {
|
||||
- nesting->taglen = b;
|
||||
- }
|
||||
- nesting->start = data->ofs;
|
||||
- nesting->next = data->nesting;
|
||||
- data->nesting = nesting;
|
||||
- if (asn1_tag_remaining(data) == -1) {
|
||||
- return false;
|
||||
- }
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* stop reading a tag */
|
||||
-bool asn1_end_tag(struct asn1_data *data)
|
||||
-{
|
||||
- struct nesting *nesting;
|
||||
-
|
||||
- /* make sure we read it all */
|
||||
- if (asn1_tag_remaining(data) != 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- nesting = data->nesting;
|
||||
-
|
||||
- if (!nesting) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- data->nesting = nesting->next;
|
||||
- talloc_free(nesting);
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* work out how many bytes are left in this nested tag */
|
||||
-int asn1_tag_remaining(struct asn1_data *data)
|
||||
-{
|
||||
- int remaining;
|
||||
- if (data->has_error) {
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (!data->nesting) {
|
||||
- data->has_error = true;
|
||||
- return -1;
|
||||
- }
|
||||
- remaining = data->nesting->taglen - (data->ofs - data->nesting->start);
|
||||
- if (remaining < 0) {
|
||||
- data->has_error = true;
|
||||
- return -1;
|
||||
- }
|
||||
- if ((size_t)remaining > data->length - data->ofs) {
|
||||
- data->has_error = true;
|
||||
- return -1;
|
||||
- }
|
||||
- return remaining;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- * Internal implementation for reading binary OIDs
|
||||
- * Reading is done as far in the buffer as valid OID
|
||||
- * till buffer ends or not valid sub-identifier is found.
|
||||
- */
|
||||
-static bool _ber_read_OID_String_impl(TALLOC_CTX *mem_ctx, DATA_BLOB blob,
|
||||
- const char **OID, size_t *bytes_eaten)
|
||||
-{
|
||||
- unsigned int i;
|
||||
- uint8_t *b;
|
||||
- unsigned int v;
|
||||
- char *tmp_oid = NULL;
|
||||
-
|
||||
- if (blob.length < 2) return false;
|
||||
-
|
||||
- b = blob.data;
|
||||
-
|
||||
- tmp_oid = talloc_asprintf(mem_ctx, "%u", b[0]/40);
|
||||
- if (!tmp_oid) goto nomem;
|
||||
- tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u", b[0]%40);
|
||||
- if (!tmp_oid) goto nomem;
|
||||
-
|
||||
- for(i = 1, v = 0; i < blob.length; i++) {
|
||||
- v = (v<<7) | (b[i]&0x7f);
|
||||
- if ( ! (b[i] & 0x80)) {
|
||||
- tmp_oid = talloc_asprintf_append_buffer(tmp_oid, ".%u", v);
|
||||
- v = 0;
|
||||
- if (bytes_eaten)
|
||||
- *bytes_eaten = i+1;
|
||||
- }
|
||||
- if (!tmp_oid) goto nomem;
|
||||
- }
|
||||
-
|
||||
- *OID = tmp_oid;
|
||||
- return true;
|
||||
-
|
||||
-nomem:
|
||||
- return false;
|
||||
-}
|
||||
-
|
||||
-/* read an object ID from a data blob */
|
||||
-bool ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID)
|
||||
-{
|
||||
- size_t bytes_eaten = 0;
|
||||
-
|
||||
- if (!_ber_read_OID_String_impl(mem_ctx, blob, OID, &bytes_eaten))
|
||||
- return false;
|
||||
-
|
||||
- return (bytes_eaten == blob.length);
|
||||
-}
|
||||
-
|
||||
-/* read an object ID from a ASN1 buffer */
|
||||
-bool asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID)
|
||||
-{
|
||||
- DATA_BLOB blob;
|
||||
- int len;
|
||||
-
|
||||
- if (!asn1_start_tag(data, ASN1_OID)) return false;
|
||||
-
|
||||
- len = asn1_tag_remaining(data);
|
||||
- if (len < 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- blob = data_blob(NULL, len);
|
||||
- if (!blob.data) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- asn1_read(data, blob.data, len);
|
||||
- asn1_end_tag(data);
|
||||
- if (data->has_error) {
|
||||
- data_blob_free(&blob);
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if (!ber_read_OID_String(mem_ctx, blob, OID)) {
|
||||
- data->has_error = true;
|
||||
- data_blob_free(&blob);
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- data_blob_free(&blob);
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* check that the next object ID is correct */
|
||||
-bool asn1_check_OID(struct asn1_data *data, const char *OID)
|
||||
-{
|
||||
- const char *id;
|
||||
-
|
||||
- if (!asn1_read_OID(data, data, &id)) return false;
|
||||
-
|
||||
- if (strcmp(id, OID) != 0) {
|
||||
- talloc_free(discard_const(id));
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- talloc_free(discard_const(id));
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* read a LDAPString from a ASN1 buffer */
|
||||
-bool asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s)
|
||||
-{
|
||||
- int len;
|
||||
- len = asn1_tag_remaining(data);
|
||||
- if (len < 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- *s = talloc_array(mem_ctx, char, len+1);
|
||||
- if (! *s) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- asn1_read(data, *s, len);
|
||||
- (*s)[len] = 0;
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* read a GeneralString from a ASN1 buffer */
|
||||
-bool asn1_read_GeneralString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s)
|
||||
-{
|
||||
- if (!asn1_start_tag(data, ASN1_GENERAL_STRING)) return false;
|
||||
- if (!asn1_read_LDAPString(data, mem_ctx, s)) return false;
|
||||
- return asn1_end_tag(data);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/* read a octet string blob */
|
||||
-bool asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob)
|
||||
-{
|
||||
- int len;
|
||||
- ZERO_STRUCTP(blob);
|
||||
- if (!asn1_start_tag(data, ASN1_OCTET_STRING)) return false;
|
||||
- len = asn1_tag_remaining(data);
|
||||
- if (len < 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- *blob = data_blob_talloc(mem_ctx, NULL, len+1);
|
||||
- if (!blob->data) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- asn1_read(data, blob->data, len);
|
||||
- asn1_end_tag(data);
|
||||
- blob->length--;
|
||||
- blob->data[len] = 0;
|
||||
-
|
||||
- if (data->has_error) {
|
||||
- data_blob_free(blob);
|
||||
- *blob = data_blob_null;
|
||||
- return false;
|
||||
- }
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-bool asn1_read_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob)
|
||||
-{
|
||||
- int len;
|
||||
- ZERO_STRUCTP(blob);
|
||||
- if (!asn1_start_tag(data, ASN1_CONTEXT_SIMPLE(num))) return false;
|
||||
- len = asn1_tag_remaining(data);
|
||||
- if (len < 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- *blob = data_blob(NULL, len);
|
||||
- if ((len != 0) && (!blob->data)) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- asn1_read(data, blob->data, len);
|
||||
- asn1_end_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* read an integer without tag*/
|
||||
-bool asn1_read_implicit_Integer(struct asn1_data *data, int *i)
|
||||
-{
|
||||
- uint8_t b;
|
||||
- *i = 0;
|
||||
-
|
||||
- while (!data->has_error && asn1_tag_remaining(data)>0) {
|
||||
- if (!asn1_read_uint8(data, &b)) return false;
|
||||
- *i = (*i << 8) + b;
|
||||
- }
|
||||
- return !data->has_error;
|
||||
-
|
||||
-}
|
||||
-
|
||||
-/* read an integer */
|
||||
-bool asn1_read_Integer(struct asn1_data *data, int *i)
|
||||
-{
|
||||
- *i = 0;
|
||||
-
|
||||
- if (!asn1_start_tag(data, ASN1_INTEGER)) return false;
|
||||
- if (!asn1_read_implicit_Integer(data, i)) return false;
|
||||
- return asn1_end_tag(data);
|
||||
-}
|
||||
-
|
||||
-/* read a BIT STRING */
|
||||
-bool asn1_read_BitString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob, uint8_t *padding)
|
||||
-{
|
||||
- int len;
|
||||
- ZERO_STRUCTP(blob);
|
||||
- if (!asn1_start_tag(data, ASN1_BIT_STRING)) return false;
|
||||
- len = asn1_tag_remaining(data);
|
||||
- if (len < 0) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- if (!asn1_read_uint8(data, padding)) return false;
|
||||
-
|
||||
- *blob = data_blob_talloc(mem_ctx, NULL, len);
|
||||
- if (!blob->data) {
|
||||
- data->has_error = true;
|
||||
- return false;
|
||||
- }
|
||||
- if (asn1_read(data, blob->data, len - 1)) {
|
||||
- blob->length--;
|
||||
- blob->data[len] = 0;
|
||||
- asn1_end_tag(data);
|
||||
- }
|
||||
-
|
||||
- if (data->has_error) {
|
||||
- data_blob_free(blob);
|
||||
- *blob = data_blob_null;
|
||||
- *padding = 0;
|
||||
- return false;
|
||||
- }
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/* read an integer */
|
||||
-bool asn1_read_enumerated(struct asn1_data *data, int *v)
|
||||
-{
|
||||
- *v = 0;
|
||||
-
|
||||
- if (!asn1_start_tag(data, ASN1_ENUMERATED)) return false;
|
||||
- while (!data->has_error && asn1_tag_remaining(data)>0) {
|
||||
- uint8_t b;
|
||||
- asn1_read_uint8(data, &b);
|
||||
- *v = (*v << 8) + b;
|
||||
- }
|
||||
- return asn1_end_tag(data);
|
||||
-}
|
||||
-
|
||||
-/* check a enumerated value is correct */
|
||||
-bool asn1_check_enumerated(struct asn1_data *data, int v)
|
||||
-{
|
||||
- uint8_t b;
|
||||
- if (!asn1_start_tag(data, ASN1_ENUMERATED)) return false;
|
||||
- asn1_read_uint8(data, &b);
|
||||
- asn1_end_tag(data);
|
||||
-
|
||||
- if (v != b)
|
||||
- data->has_error = false;
|
||||
-
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/* write an enumerated value to the stream */
|
||||
-bool asn1_write_enumerated(struct asn1_data *data, uint8_t v)
|
||||
-{
|
||||
- if (!asn1_push_tag(data, ASN1_ENUMERATED)) return false;
|
||||
- asn1_write_uint8(data, v);
|
||||
- asn1_pop_tag(data);
|
||||
- return !data->has_error;
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- Get us the data just written without copying
|
||||
-*/
|
||||
-bool asn1_blob(const struct asn1_data *asn1, DATA_BLOB *blob)
|
||||
-{
|
||||
- if (asn1->has_error) {
|
||||
- return false;
|
||||
- }
|
||||
- if (asn1->nesting != NULL) {
|
||||
- return false;
|
||||
- }
|
||||
- blob->data = asn1->data;
|
||||
- blob->length = asn1->length;
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- Fill in an asn1 struct without making a copy
|
||||
-*/
|
||||
-void asn1_load_nocopy(struct asn1_data *data, uint8_t *buf, size_t len)
|
||||
-{
|
||||
- ZERO_STRUCTP(data);
|
||||
- data->data = buf;
|
||||
- data->length = len;
|
||||
-}
|
||||
-
|
||||
diff --git a/asn1.h b/asn1.h
|
||||
index 615041f..a773885 100644
|
||||
--- a/asn1.h
|
||||
+++ b/asn1.h
|
||||
@@ -58,44 +58,7 @@ bool asn1_write(struct asn1_data *data, const void *p, int len);
|
||||
bool asn1_write_uint8(struct asn1_data *data, uint8_t v);
|
||||
bool asn1_push_tag(struct asn1_data *data, uint8_t tag);
|
||||
bool asn1_pop_tag(struct asn1_data *data);
|
||||
-bool asn1_write_implicit_Integer(struct asn1_data *data, int i);
|
||||
-bool asn1_write_Integer(struct asn1_data *data, int i);
|
||||
-bool asn1_write_BitString(struct asn1_data *data, const void *p, size_t length, uint8_t padding);
|
||||
bool ber_write_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, const char *OID);
|
||||
bool asn1_write_OID(struct asn1_data *data, const char *OID);
|
||||
bool asn1_write_OctetString(struct asn1_data *data, const void *p, size_t length);
|
||||
-bool asn1_write_LDAPString(struct asn1_data *data, const char *s);
|
||||
-bool asn1_write_DATA_BLOB_LDAPString(struct asn1_data *data, const DATA_BLOB *s);
|
||||
-bool asn1_write_GeneralString(struct asn1_data *data, const char *s);
|
||||
-bool asn1_write_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob);
|
||||
-bool asn1_write_BOOLEAN(struct asn1_data *data, bool v);
|
||||
-bool asn1_read_BOOLEAN(struct asn1_data *data, bool *v);
|
||||
-bool asn1_check_BOOLEAN(struct asn1_data *data, bool v);
|
||||
-bool asn1_write_BOOLEAN_context(struct asn1_data *data, bool v, int context);
|
||||
-bool asn1_read_BOOLEAN_context(struct asn1_data *data, bool *v, int context);
|
||||
-bool asn1_load(struct asn1_data *data, DATA_BLOB blob);
|
||||
-bool asn1_peek(struct asn1_data *data, void *p, int len);
|
||||
-bool asn1_read(struct asn1_data *data, void *p, int len);
|
||||
-bool asn1_read_uint8(struct asn1_data *data, uint8_t *v);
|
||||
-bool asn1_peek_uint8(struct asn1_data *data, uint8_t *v);
|
||||
-bool asn1_peek_tag(struct asn1_data *data, uint8_t tag);
|
||||
-bool asn1_start_tag(struct asn1_data *data, uint8_t tag);
|
||||
-bool asn1_end_tag(struct asn1_data *data);
|
||||
-int asn1_tag_remaining(struct asn1_data *data);
|
||||
-bool ber_read_OID_String(TALLOC_CTX *mem_ctx, DATA_BLOB blob, const char **OID);
|
||||
-bool asn1_read_OID(struct asn1_data *data, TALLOC_CTX *mem_ctx, const char **OID);
|
||||
-bool asn1_check_OID(struct asn1_data *data, const char *OID);
|
||||
-bool asn1_read_LDAPString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s);
|
||||
-bool asn1_read_GeneralString(struct asn1_data *data, TALLOC_CTX *mem_ctx, char **s);
|
||||
-bool asn1_read_OctetString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob);
|
||||
-bool asn1_read_ContextSimple(struct asn1_data *data, uint8_t num, DATA_BLOB *blob);
|
||||
-bool asn1_read_implicit_Integer(struct asn1_data *data, int *i);
|
||||
-bool asn1_read_Integer(struct asn1_data *data, int *i);
|
||||
-bool asn1_read_BitString(struct asn1_data *data, TALLOC_CTX *mem_ctx, DATA_BLOB *blob, uint8_t *padding);
|
||||
-bool asn1_read_enumerated(struct asn1_data *data, int *v);
|
||||
-bool asn1_check_enumerated(struct asn1_data *data, int v);
|
||||
-bool asn1_write_enumerated(struct asn1_data *data, uint8_t v);
|
||||
-bool asn1_blob(const struct asn1_data *asn1, DATA_BLOB *blob);
|
||||
-void asn1_load_nocopy(struct asn1_data *data, uint8_t *buf, size_t len);
|
||||
-
|
||||
#endif /* _ASN_1_H */
|
||||
--
|
||||
1.8.3.1
|
||||
|
276
0004-data_blob-clean-out-unused-functions.patch
Normal file
276
0004-data_blob-clean-out-unused-functions.patch
Normal file
@ -0,0 +1,276 @@
|
||||
From 9f1c0722a3e20047bcffe3a43f229e891da8c01b Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Layton <jlayton@samba.org>
|
||||
Date: Wed, 9 Oct 2013 09:05:22 -0400
|
||||
Subject: [PATCH] data_blob: clean out unused functions
|
||||
|
||||
Cut another 6k or so out of the cifs.upcall binary.
|
||||
|
||||
Signed-off-by: Jeff Layton <jlayton@samba.org>
|
||||
---
|
||||
data_blob.c | 168 ------------------------------------------------------------
|
||||
data_blob.h | 62 ----------------------
|
||||
2 files changed, 230 deletions(-)
|
||||
|
||||
diff --git a/data_blob.c b/data_blob.c
|
||||
index 16c78ce..834d810 100644
|
||||
--- a/data_blob.c
|
||||
+++ b/data_blob.c
|
||||
@@ -71,18 +71,6 @@ _PUBLIC_ DATA_BLOB data_blob_talloc_named(TALLOC_CTX *mem_ctx, const void *p, si
|
||||
}
|
||||
|
||||
/**
|
||||
- construct a zero data blob, using supplied TALLOC_CTX.
|
||||
- use this sparingly as it initialises data - better to initialise
|
||||
- yourself if you want specific data in the blob
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_talloc_zero(TALLOC_CTX *mem_ctx, size_t length)
|
||||
-{
|
||||
- DATA_BLOB blob = data_blob_talloc(mem_ctx, NULL, length);
|
||||
- data_blob_clear(&blob);
|
||||
- return blob;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
free a data blob
|
||||
**/
|
||||
_PUBLIC_ void data_blob_free(DATA_BLOB *d)
|
||||
@@ -94,159 +82,3 @@ _PUBLIC_ void data_blob_free(DATA_BLOB *d)
|
||||
}
|
||||
}
|
||||
|
||||
-/**
|
||||
-clear a DATA_BLOB's contents
|
||||
-**/
|
||||
-_PUBLIC_ void data_blob_clear(DATA_BLOB *d)
|
||||
-{
|
||||
- if (d->data) {
|
||||
- memset(d->data, 0, d->length);
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
-free a data blob and clear its contents
|
||||
-**/
|
||||
-_PUBLIC_ void data_blob_clear_free(DATA_BLOB *d)
|
||||
-{
|
||||
- data_blob_clear(d);
|
||||
- data_blob_free(d);
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/**
|
||||
-check if two data blobs are equal
|
||||
-**/
|
||||
-_PUBLIC_ int data_blob_cmp(const DATA_BLOB *d1, const DATA_BLOB *d2)
|
||||
-{
|
||||
- int ret;
|
||||
- if (d1->data == NULL && d2->data != NULL) {
|
||||
- return -1;
|
||||
- }
|
||||
- if (d1->data != NULL && d2->data == NULL) {
|
||||
- return 1;
|
||||
- }
|
||||
- if (d1->data == d2->data) {
|
||||
- return d1->length - d2->length;
|
||||
- }
|
||||
- ret = memcmp(d1->data, d2->data, MIN(d1->length, d2->length));
|
||||
- if (ret == 0) {
|
||||
- return d1->length - d2->length;
|
||||
- }
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
-print the data_blob as hex string
|
||||
-**/
|
||||
-_PUBLIC_ char *data_blob_hex_string_lower(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob)
|
||||
-{
|
||||
- unsigned int i;
|
||||
- char *hex_string;
|
||||
-
|
||||
- hex_string = talloc_array(mem_ctx, char, (blob->length*2)+1);
|
||||
- if (!hex_string) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- /* this must be lowercase or w2k8 cannot join a samba domain,
|
||||
- as this routine is used to encode extended DNs and windows
|
||||
- only accepts lowercase hexadecimal numbers */
|
||||
- for (i = 0; i < blob->length; i++)
|
||||
- slprintf(&hex_string[i*2], 3, "%02x", blob->data[i]);
|
||||
-
|
||||
- hex_string[(blob->length*2)] = '\0';
|
||||
- return hex_string;
|
||||
-}
|
||||
-
|
||||
-_PUBLIC_ char *data_blob_hex_string_upper(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob)
|
||||
-{
|
||||
- unsigned int i;
|
||||
- char *hex_string;
|
||||
-
|
||||
- hex_string = talloc_array(mem_ctx, char, (blob->length*2)+1);
|
||||
- if (!hex_string) {
|
||||
- return NULL;
|
||||
- }
|
||||
-
|
||||
- for (i = 0; i < blob->length; i++)
|
||||
- slprintf(&hex_string[i*2], 3, "%02X", blob->data[i]);
|
||||
-
|
||||
- hex_string[(blob->length*2)] = '\0';
|
||||
- return hex_string;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- useful for constructing data blobs in test suites, while
|
||||
- avoiding const warnings
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_string_const(const char *str)
|
||||
-{
|
||||
- DATA_BLOB blob;
|
||||
- blob.data = discard_const_p(uint8_t, str);
|
||||
- blob.length = str ? strlen(str) : 0;
|
||||
- return blob;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- useful for constructing data blobs in test suites, while
|
||||
- avoiding const warnings
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_string_const_null(const char *str)
|
||||
-{
|
||||
- DATA_BLOB blob;
|
||||
- blob.data = discard_const_p(uint8_t, str);
|
||||
- blob.length = str ? strlen(str)+1 : 0;
|
||||
- return blob;
|
||||
-}
|
||||
-
|
||||
-/**
|
||||
- * Create a new data blob from const data
|
||||
- */
|
||||
-
|
||||
-_PUBLIC_ DATA_BLOB data_blob_const(const void *p, size_t length)
|
||||
-{
|
||||
- DATA_BLOB blob;
|
||||
- blob.data = discard_const_p(uint8_t, p);
|
||||
- blob.length = length;
|
||||
- return blob;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/**
|
||||
- realloc a data_blob
|
||||
-**/
|
||||
-_PUBLIC_ bool data_blob_realloc(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, size_t length)
|
||||
-{
|
||||
- blob->data = talloc_realloc(mem_ctx, blob->data, uint8_t, length);
|
||||
- if (blob->data == NULL)
|
||||
- return false;
|
||||
- blob->length = length;
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
-
|
||||
-/**
|
||||
- append some data to a data blob
|
||||
-**/
|
||||
-_PUBLIC_ bool data_blob_append(TALLOC_CTX *mem_ctx, DATA_BLOB *blob,
|
||||
- const void *p, size_t length)
|
||||
-{
|
||||
- size_t old_len = blob->length;
|
||||
- size_t new_len = old_len + length;
|
||||
- if (new_len < length || new_len < old_len) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if ((const uint8_t *)p + length < (const uint8_t *)p) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- if (!data_blob_realloc(mem_ctx, blob, new_len)) {
|
||||
- return false;
|
||||
- }
|
||||
-
|
||||
- memcpy(blob->data + old_len, p, length);
|
||||
- return true;
|
||||
-}
|
||||
-
|
||||
diff --git a/data_blob.h b/data_blob.h
|
||||
index 83e6cd5..ccdf30d 100644
|
||||
--- a/data_blob.h
|
||||
+++ b/data_blob.h
|
||||
@@ -61,72 +61,10 @@ _PUBLIC_ DATA_BLOB data_blob_named(const void *p, size_t length, const char *nam
|
||||
_PUBLIC_ DATA_BLOB data_blob_talloc_named(TALLOC_CTX *mem_ctx, const void *p, size_t length, const char *name);
|
||||
|
||||
/**
|
||||
- construct a zero data blob, using supplied TALLOC_CTX.
|
||||
- use this sparingly as it initialises data - better to initialise
|
||||
- yourself if you want specific data in the blob
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_talloc_zero(TALLOC_CTX *mem_ctx, size_t length);
|
||||
-
|
||||
-/**
|
||||
free a data blob
|
||||
**/
|
||||
_PUBLIC_ void data_blob_free(DATA_BLOB *d);
|
||||
|
||||
-/**
|
||||
-clear a DATA_BLOB's contents
|
||||
-**/
|
||||
-_PUBLIC_ void data_blob_clear(DATA_BLOB *d);
|
||||
-
|
||||
-/**
|
||||
-free a data blob and clear its contents
|
||||
-**/
|
||||
-_PUBLIC_ void data_blob_clear_free(DATA_BLOB *d);
|
||||
-
|
||||
-/**
|
||||
-check if two data blobs are equal
|
||||
-**/
|
||||
-_PUBLIC_ int data_blob_cmp(const DATA_BLOB *d1, const DATA_BLOB *d2);
|
||||
-
|
||||
-/**
|
||||
-print the data_blob as hex string
|
||||
-**/
|
||||
-_PUBLIC_ char *data_blob_hex_string_upper(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob);
|
||||
-
|
||||
-/**
|
||||
-print the data_blob as hex string
|
||||
-**/
|
||||
-_PUBLIC_ char *data_blob_hex_string_lower(TALLOC_CTX *mem_ctx, const DATA_BLOB *blob);
|
||||
-
|
||||
-/**
|
||||
- useful for constructing data blobs in test suites, while
|
||||
- avoiding const warnings
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_string_const(const char *str);
|
||||
-
|
||||
-/**
|
||||
- useful for constructing data blobs in test suites, while
|
||||
- avoiding const warnings
|
||||
-
|
||||
- includes the terminating null character (as opposed to data_blo_string_const)
|
||||
-**/
|
||||
-_PUBLIC_ DATA_BLOB data_blob_string_const_null(const char *str);
|
||||
-
|
||||
-/**
|
||||
- * Create a new data blob from const data
|
||||
- */
|
||||
-_PUBLIC_ DATA_BLOB data_blob_const(const void *p, size_t length);
|
||||
-
|
||||
-/**
|
||||
- realloc a data_blob
|
||||
-**/
|
||||
-_PUBLIC_ bool data_blob_realloc(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, size_t length);
|
||||
-
|
||||
-/**
|
||||
- append some data to a data blob
|
||||
-**/
|
||||
-_PUBLIC_ bool data_blob_append(TALLOC_CTX *mem_ctx, DATA_BLOB *blob,
|
||||
- const void *p, size_t length);
|
||||
-
|
||||
extern const DATA_BLOB data_blob_null;
|
||||
|
||||
#endif /* _SAMBA_DATABLOB_H_ */
|
||||
--
|
||||
1.8.3.1
|
||||
|
100
0005-mount.cifs-fix-bad-free-of-string-returned-by-dirnam.patch
Normal file
100
0005-mount.cifs-fix-bad-free-of-string-returned-by-dirnam.patch
Normal file
@ -0,0 +1,100 @@
|
||||
From 7e2e95d0c84bd6960c46f1fa1c8227c50dd7a4b3 Mon Sep 17 00:00:00 2001
|
||||
From: Jeff Layton <jlayton@samba.org>
|
||||
Date: Thu, 10 Oct 2013 22:05:05 -0400
|
||||
Subject: [PATCH] mount.cifs: fix bad free() of string returned by dirname()
|
||||
|
||||
Coverity says:
|
||||
|
||||
Error: CPPCHECK_WARNING: [#def10]
|
||||
cifs-utils-6.2/mount.cifs.c:1518: error[memleakOnRealloc]: Common realloc mistake: 'mtabdir' nulled but not freed upon failure
|
||||
|
||||
del_mtab has a number of bugs in handling of allocated memory:
|
||||
|
||||
a) the return value of strdup() is not checked
|
||||
|
||||
b) It calls realloc() on a pointer that wasn't returned by an allocation
|
||||
function (e.g. malloc, calloc, etc.)
|
||||
|
||||
c) If realloc() fails, it doesn't call free() on the original memory
|
||||
returned by strdup()
|
||||
|
||||
Fix all of these bugs and add newlines to the end of the error messages
|
||||
in del_mtab.
|
||||
|
||||
Signed-off-by: Jeff Layton <jlayton@samba.org>
|
||||
---
|
||||
mount.cifs.c | 29 ++++++++++++++++++-----------
|
||||
1 file changed, 18 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/mount.cifs.c b/mount.cifs.c
|
||||
index 7206dcb..497665d 100644
|
||||
--- a/mount.cifs.c
|
||||
+++ b/mount.cifs.c
|
||||
@@ -1508,23 +1508,29 @@ add_mtab_exit:
|
||||
static int
|
||||
del_mtab(char *mountpoint)
|
||||
{
|
||||
- int tmprc, rc = 0;
|
||||
+ int len, tmprc, rc = 0;
|
||||
FILE *mnttmp, *mntmtab;
|
||||
struct mntent *mountent;
|
||||
- char *mtabfile, *mtabdir, *mtabtmpfile;
|
||||
+ char *mtabfile, *mtabdir, *mtabtmpfile = NULL;
|
||||
|
||||
mtabfile = strdup(MOUNTED);
|
||||
- mtabdir = dirname(mtabfile);
|
||||
- mtabdir = realloc(mtabdir, strlen(mtabdir) + strlen(MNT_TMP_FILE) + 2);
|
||||
- if (!mtabdir) {
|
||||
- fprintf(stderr, "del_mtab: cannot determine current mtab path");
|
||||
+ if (!mtabfile) {
|
||||
+ fprintf(stderr, "del_mtab: cannot strdup MOUNTED\n");
|
||||
rc = EX_FILEIO;
|
||||
goto del_mtab_exit;
|
||||
}
|
||||
|
||||
- mtabtmpfile = strcat(mtabdir, MNT_TMP_FILE);
|
||||
+ mtabdir = dirname(mtabfile);
|
||||
+ len = strlen(mtabdir) + strlen(MNT_TMP_FILE);
|
||||
+ mtabtmpfile = malloc(len + 1);
|
||||
if (!mtabtmpfile) {
|
||||
- fprintf(stderr, "del_mtab: cannot allocate memory to tmp file");
|
||||
+ fprintf(stderr, "del_mtab: cannot allocate memory to tmp file\n");
|
||||
+ rc = EX_FILEIO;
|
||||
+ goto del_mtab_exit;
|
||||
+ }
|
||||
+
|
||||
+ if (sprintf(mtabtmpfile, "%s%s", mtabdir, MNT_TMP_FILE) != len) {
|
||||
+ fprintf(stderr, "del_mtab: error writing new string\n");
|
||||
rc = EX_FILEIO;
|
||||
goto del_mtab_exit;
|
||||
}
|
||||
@@ -1532,14 +1538,14 @@ del_mtab(char *mountpoint)
|
||||
atexit(unlock_mtab);
|
||||
rc = lock_mtab();
|
||||
if (rc) {
|
||||
- fprintf(stderr, "del_mtab: cannot lock mtab");
|
||||
+ fprintf(stderr, "del_mtab: cannot lock mtab\n");
|
||||
rc = EX_FILEIO;
|
||||
goto del_mtab_exit;
|
||||
}
|
||||
|
||||
mtabtmpfile = mktemp(mtabtmpfile);
|
||||
if (!mtabtmpfile) {
|
||||
- fprintf(stderr, "del_mtab: cannot setup tmp file destination");
|
||||
+ fprintf(stderr, "del_mtab: cannot setup tmp file destination\n");
|
||||
rc = EX_FILEIO;
|
||||
goto del_mtab_exit;
|
||||
}
|
||||
@@ -1587,7 +1593,8 @@ del_mtab(char *mountpoint)
|
||||
|
||||
del_mtab_exit:
|
||||
unlock_mtab();
|
||||
- free(mtabdir);
|
||||
+ free(mtabtmpfile);
|
||||
+ free(mtabfile);
|
||||
return rc;
|
||||
|
||||
del_mtab_error:
|
||||
--
|
||||
1.8.3.1
|
||||
|
@ -3,7 +3,7 @@
|
||||
|
||||
Name: cifs-utils
|
||||
Version: 6.2
|
||||
Release: 2%{pre_release}%{?dist}
|
||||
Release: 3%{pre_release}%{?dist}
|
||||
Summary: Utilities for mounting and managing CIFS mounts
|
||||
|
||||
Group: System Environment/Daemons
|
||||
@ -18,7 +18,11 @@ Requires(post): /usr/sbin/alternatives
|
||||
Requires(preun): /usr/sbin/alternatives
|
||||
|
||||
Source0: ftp://ftp.samba.org/pub/linux-cifs/cifs-utils/%{name}-%{version}%{pre_release}.tar.bz2
|
||||
Patch1: 0001-setcifsacl-fix-bad-bit-shift-in-raw_str_to_sid.patch
|
||||
Patch1: 0001-get-setcifsacl-fix-bad-bit-shifts.patch
|
||||
Patch2: 0002-getcifsacl-remove-some-dead-code.patch
|
||||
Patch3: 0003-asn1-remove-some-usused-functions.patch
|
||||
Patch4: 0004-data_blob-clean-out-unused-functions.patch
|
||||
Patch5: 0005-mount.cifs-fix-bad-free-of-string-returned-by-dirnam.patch
|
||||
|
||||
%description
|
||||
The SMB/CIFS protocol is a standard file sharing protocol widely deployed
|
||||
@ -40,6 +44,10 @@ necessary for building ID mapping plugins for cifs-utils.
|
||||
%prep
|
||||
%setup -q -n %{name}-%{version}%{pre_release}
|
||||
%patch1 -p1
|
||||
%patch2 -p1
|
||||
%patch3 -p1
|
||||
%patch4 -p1
|
||||
%patch5 -p1
|
||||
|
||||
%build
|
||||
%configure --prefix=/usr ROOTSBINDIR=%{_sbindir}
|
||||
@ -89,6 +97,12 @@ fi
|
||||
%{_includedir}/cifsidmap.h
|
||||
|
||||
%changelog
|
||||
* Fri Oct 11 2013 Jeff Layton <jlayton@redhat.com> 6.2-3
|
||||
- fixes for bugs reported by coverity:
|
||||
- update bad bit shift patch with one that patches getcifsacl.c too
|
||||
- remove some dead code from getcifsacl.c, asn1.c, and data_blob.c
|
||||
- fix bad handling of allocated memory in del_mtab in mount.cifs.c
|
||||
|
||||
* Wed Oct 09 2013 Jeff Layton <jlayton@redhat.com> 6.2-2
|
||||
- fix bad bit shift in setcifsacl.c
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user