Skip to content

Commit 614ddc4

Browse files
committed
[bug] accept trailing backslash in string, prevent jdatadecode infinite recursion
1 parent 7681fb5 commit 614ddc4

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

jdatadecode.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@
223223
data(j).(N_ArrayData) = jdatadecode(data(j).(N_ArrayData), opt);
224224
end
225225
if (isstruct(data(j).(N_ArrayData)) && isfield(data(j).(N_ArrayData), N_ArrayType))
226-
data(j).(N_ArrayData) = jdatadecode(data(j).(N_ArrayData), varargin{:});
226+
data(j).(N_ArrayData) = jdatadecode(data(j).(N_ArrayData), opt);
227227
end
228228
if (iscell(data(j).(N_ArrayData)))
229229
data(j).(N_ArrayData) = cell2mat(cellfun(@(x) double(x(:)), data(j).(N_ArrayData), 'uniformoutput', 0)).';
@@ -503,7 +503,7 @@
503503
edgedata = data(j).(N_GraphEdges0);
504504
isdirected = 0;
505505
elseif (isfield(data, N_GraphMatrix))
506-
edgedata = jdatadecode(data(j).(N_GraphMatrix), varargin{:});
506+
edgedata = jdatadecode(data(j).(N_GraphMatrix), opt);
507507
end
508508

509509
if (exist('edgedata', 'var'))

loadjson.m

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,9 +823,23 @@
823823
if ~ischar(str) || isempty(find(str == '\', 1))
824824
return
825825
end
826+
827+
% Handle lone trailing backslash: temporarily remove it before sprintf
828+
% But not if preceded by \ (i.e. \\) which is an escaped backslash
829+
len = length(str);
830+
trailing = (str(end) == 92) && (len < 2 || str(end - 1) ~= 92); % 92 = '\'
831+
if trailing
832+
str = str(1:end - 1);
833+
end
834+
826835
newstr = sprintf(str);
827836
newstr = regexprep(newstr, '\\u([0-9A-Fa-f]{4})', '${char(base2dec($1,16))}');
828837

838+
% Restore trailing backslash
839+
if trailing
840+
newstr = [newstr, '\'];
841+
end
842+
829843
%% -------------------------------------------------------------------------
830844

831845
function arraystr = sscanf_prep(str)

0 commit comments

Comments
 (0)