Coverage Report

Created: 2026-08-31 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xmlsec/src/membuf.c
Line
Count
Source
1
/**
2
 * XML Security Library (http://www.aleksey.com/xmlsec).
3
 *
4
 * This is free software; see the Copyright file in the source distribution for precise wording.
5
 *
6
 * Copyright (C) 2002-2026 Aleksey Sanin <aleksey@aleksey.com>. All Rights Reserved.
7
 */
8
/**
9
 * @addtogroup xmlsec_core_membuf
10
 * @brief Memory buffer transform functions.
11
 */
12
#include "globals.h"
13
14
#include <stdlib.h>
15
#include <string.h>
16
17
#include <libxml/tree.h>
18
19
#include <xmlsec/xmlsec.h>
20
#include <xmlsec/buffer.h>
21
#include <xmlsec/keys.h>
22
#include <xmlsec/transforms.h>
23
#include <xmlsec/base64.h>
24
#include <xmlsec/membuf.h>
25
#include <xmlsec/errors.h>
26
27
#include "cast_helpers.h"
28
29
/******************************************************************************
30
 *
31
 * Memory Buffer Transform
32
 *
33
 * xmlSecTransform + xmlSecBuffer
34
 *
35
  *****************************************************************************/
36
580k
XMLSEC_TRANSFORM_DECLARE(MemBuf, xmlSecBuffer)
37
580k
#define xmlSecMemBufSize XMLSEC_TRANSFORM_SIZE(MemBuf)
38
580k
39
580k
static int              xmlSecTransformMemBufInitialize         (xmlSecTransformPtr transform);
40
580k
static void             xmlSecTransformMemBufFinalize           (xmlSecTransformPtr transform);
41
580k
static int              xmlSecTransformMemBufExecute            (xmlSecTransformPtr transform,
42
580k
                                                                 int last,
43
580k
                                                                 xmlSecTransformCtxPtr transformCtx);
44
580k
static xmlSecTransformKlass xmlSecTransformMemBufKlass = {
45
580k
    /* klass/object sizes */
46
580k
    sizeof(xmlSecTransformKlass),               /* xmlSecSize klassSize */
47
580k
    xmlSecMemBufSize,                           /* xmlSecSize objSize */
48
580k
49
580k
    xmlSecNameMemBuf,                           /* const xmlChar* name; */
50
580k
    NULL,                                       /* const xmlChar* href; */
51
580k
    0,                                          /* xmlSecAlgorithmUsage usage; */
52
580k
53
580k
    xmlSecTransformMemBufInitialize,            /* xmlSecTransformInitializeMethod initialize; */
54
580k
    xmlSecTransformMemBufFinalize,              /* xmlSecTransformFinalizeMethod finalize; */
55
580k
    NULL,                                       /* xmlSecTransformNodeReadMethod readNode; */
56
580k
    NULL,                                       /* xmlSecTransformNodeWriteMethod writeNode; */
57
580k
    NULL,                                       /* xmlSecTransformSetKeyReqMethod setKeyReq; */
58
580k
    NULL,                                       /* xmlSecTransformSetKeyMethod setKey; */
59
580k
    NULL,                                       /* xmlSecTransformValidateMethod validate; */
60
580k
    xmlSecTransformDefaultGetDataType,          /* xmlSecTransformGetDataTypeMethod getDataType; */
61
580k
    xmlSecTransformDefaultPushBin,              /* xmlSecTransformPushBinMethod pushBin; */
62
580k
    xmlSecTransformDefaultPopBin,               /* xmlSecTransformPopBinMethod popBin; */
63
580k
    NULL,                                       /* xmlSecTransformPushXmlMethod pushXml; */
64
580k
    NULL,                                       /* xmlSecTransformPopXmlMethod popXml; */
65
580k
    xmlSecTransformMemBufExecute,               /* xmlSecTransformExecuteMethod execute; */
66
580k
67
580k
    NULL,                                       /* void* reserved0; */
68
580k
    NULL,                                       /* void* reserved1; */
69
580k
};
70
580k
71
580k
/**
72
580k
 * @brief The memory buffer transform (used to store the data that go through it).
73
580k
 *
74
580k
 * @return memory buffer transform klass.
75
580k
 */
76
580k
xmlSecTransformId
77
580k
xmlSecTransformMemBufGetKlass(void) {
78
211k
    return(&xmlSecTransformMemBufKlass);
79
211k
}
80
81
/**
82
 * @brief Gets the pointer to memory buffer transform buffer.
83
 * @param transform the pointer to memory buffer transform.
84
 *
85
 * @return pointer to the transform's xmlSecBuffer.
86
 */
87
xmlSecBufferPtr
88
18.0k
xmlSecTransformMemBufGetBuffer(xmlSecTransformPtr transform) {
89
18.0k
    xmlSecBufferPtr buffer;
90
91
18.0k
    xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), NULL);
92
93
18.0k
    buffer = xmlSecMemBufGetCtx(transform);
94
18.0k
    xmlSecAssert2(buffer != NULL, NULL);
95
96
18.0k
    return(buffer);
97
18.0k
}
98
99
static int
100
18.0k
xmlSecTransformMemBufInitialize(xmlSecTransformPtr transform) {
101
18.0k
    xmlSecBufferPtr buffer;
102
18.0k
    int ret;
103
104
18.0k
    xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), -1);
105
106
18.0k
    buffer = xmlSecMemBufGetCtx(transform);
107
18.0k
    xmlSecAssert2(buffer != NULL, -1);
108
109
18.0k
    ret = xmlSecBufferInitialize(buffer, 0);
110
18.0k
    if(ret < 0) {
111
0
        xmlSecInternalError("xmlSecBufferInitialize",
112
0
                            xmlSecTransformGetName(transform));
113
0
        return(-1);
114
0
    }
115
18.0k
    return(0);
116
18.0k
}
117
118
static void
119
18.0k
xmlSecTransformMemBufFinalize(xmlSecTransformPtr transform) {
120
18.0k
    xmlSecBufferPtr buffer;
121
122
18.0k
    xmlSecAssert(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId));
123
124
18.0k
    buffer = xmlSecMemBufGetCtx(transform);
125
18.0k
    xmlSecAssert(buffer != NULL);
126
127
18.0k
    xmlSecBufferFinalize(buffer);
128
18.0k
}
129
130
static int
131
139k
xmlSecTransformMemBufExecute(xmlSecTransformPtr transform, int last, xmlSecTransformCtxPtr transformCtx) {
132
139k
    xmlSecBufferPtr buffer;
133
139k
    xmlSecBufferPtr in, out;
134
139k
    xmlSecSize inSize;
135
139k
    int ret;
136
137
139k
    xmlSecAssert2(xmlSecTransformCheckId(transform, xmlSecTransformMemBufId), -1);
138
139k
    xmlSecAssert2(transformCtx != NULL, -1);
139
140
139k
    buffer = xmlSecMemBufGetCtx(transform);
141
139k
    xmlSecAssert2(buffer != NULL, -1);
142
143
139k
    in = &(transform->inBuf);
144
139k
    out = &(transform->outBuf);
145
139k
    inSize = xmlSecBufferGetSize(in);
146
147
139k
    if(transform->status == xmlSecTransformStatusNone) {
148
13.6k
        transform->status = xmlSecTransformStatusWorking;
149
13.6k
    }
150
151
139k
    if(transform->status == xmlSecTransformStatusWorking) {
152
        /* just copy everything from in to our buffer and out */
153
139k
        ret = xmlSecBufferAppend(buffer, xmlSecBufferGetData(in), inSize);
154
139k
        if(ret < 0) {
155
0
            xmlSecInternalError2("xmlSecBufferAppend",
156
0
                                 xmlSecTransformGetName(transform),
157
0
                                 "size=" XMLSEC_SIZE_FMT, inSize);
158
0
            return(-1);
159
0
        }
160
161
139k
        ret = xmlSecBufferAppend(out, xmlSecBufferGetData(in), inSize);
162
139k
        if(ret < 0) {
163
0
            xmlSecInternalError2("xmlSecBufferAppend",
164
0
                                 xmlSecTransformGetName(transform),
165
0
                                 "size=" XMLSEC_SIZE_FMT, inSize);
166
0
            return(-1);
167
0
        }
168
169
139k
        ret = xmlSecBufferRemoveHead(in, inSize);
170
139k
        if(ret < 0) {
171
0
            xmlSecInternalError2("xmlSecBufferRemoveHead",
172
0
                                 xmlSecTransformGetName(transform),
173
0
                                "size=" XMLSEC_SIZE_FMT, inSize);
174
0
            return(-1);
175
0
        }
176
177
139k
        if(last != 0) {
178
13.6k
            transform->status = xmlSecTransformStatusFinished;
179
13.6k
        }
180
139k
    } else if(transform->status == xmlSecTransformStatusFinished) {
181
        /* the only way we can get here is if there is no input */
182
0
        xmlSecAssert2(inSize == 0, -1);
183
0
    } else {
184
0
        xmlSecInvalidTransformStatusError(transform);
185
0
        return(-1);
186
0
    }
187
139k
    return(0);
188
139k
}