@@ -247,17 +247,15 @@ lyb_parse_model(const char *data, const struct lys_module **mod, struct lyb_stat
247247{
248248 int r , ret = 0 ;
249249 char * mod_name = NULL , mod_rev [11 ];
250- uint16_t rev = 0 ;
251- uint8_t tmp_buf [2 ];
250+ uint16_t rev ;
252251
253252 /* model name */
254253 ret += (r = lyb_read_string (data , & mod_name , 1 , lybs ));
255254 LYB_HAVE_READ_GOTO (r , data , error );
256255
257256 /* revision */
258- ret += (r = lyb_read (data , tmp_buf , sizeof tmp_buf , lybs ));
257+ ret += (r = lyb_read (data , ( uint8_t * ) & rev , 2 , lybs ));
259258 LYB_HAVE_READ_GOTO (r , data , error );
260- rev = tmp_buf [0 ] | (tmp_buf [1 ] << 8 );
261259
262260 if (rev ) {
263261 sprintf (mod_rev , "%04u-%02u-%02u" , ((rev & 0xFE00 ) >> 9 ) + 2000 , (rev & 0x01E0 ) >> 5 , (rev & 0x001F ));
@@ -991,6 +989,24 @@ lyb_parse_schema_hash(const struct lys_node *sparent, const struct lys_module *m
991989 return ret ;
992990}
993991
992+ static int
993+ lyb_skip_subtree (const char * data , struct lyb_state * lybs )
994+ {
995+ int r , ret = 0 ;
996+
997+ do {
998+ ret += (r = lyb_read (data , NULL , lybs -> written [lybs -> used - 1 ], lybs ));
999+ LYB_HAVE_READ_RETURN (r , data , -1 );
1000+
1001+ /* also skip the meta information inside */
1002+ r = lybs -> inner_chunks [lybs -> used - 1 ] * LYB_META_BYTES ;
1003+ data += r ;
1004+ ret += r ;
1005+ } while (lybs -> written [lybs -> used - 1 ]);
1006+
1007+ return ret ;
1008+ }
1009+
9941010static int
9951011lyb_parse_subtree (const char * data , struct lyd_node * parent , struct lyd_node * * first_sibling , const char * yang_data_name ,
9961012 int options , struct unres_data * unres , struct lyb_state * lybs )
@@ -1026,13 +1042,8 @@ lyb_parse_subtree(const char *data, struct lyd_node *parent, struct lyd_node **f
10261042
10271043 if (!mod || !snode ) {
10281044 /* unknown data subtree, skip it whole */
1029- do {
1030- ret += (r = lyb_read (data , NULL , lybs -> written [lybs -> used - 1 ], lybs ));
1031- /* also skip the meta information inside */
1032- r = lybs -> inner_chunks [lybs -> used - 1 ] * LYB_META_BYTES ;
1033- data += r ;
1034- ret += r ;
1035- } while (lybs -> written [lybs -> used - 1 ]);
1045+ ret += (r = lyb_skip_subtree (data , lybs ));
1046+ LYB_HAVE_READ_GOTO (r , data , error );
10361047 goto stop_subtree ;
10371048 }
10381049
@@ -1293,3 +1304,77 @@ lyd_parse_lyb(struct ly_ctx *ctx, const char *data, int options, const struct ly
12931304 }
12941305 return node ;
12951306}
1307+
1308+ API int
1309+ lyd_lyb_data_length (const char * data )
1310+ {
1311+ struct lyb_state lybs ;
1312+ int r = 0 , ret = 0 , i ;
1313+ size_t len ;
1314+ uint8_t buf [LYB_SIZE_MAX ];
1315+
1316+ if (!data ) {
1317+ return -1 ;
1318+ }
1319+
1320+ lybs .written = malloc (LYB_STATE_STEP * sizeof * lybs .written );
1321+ lybs .position = malloc (LYB_STATE_STEP * sizeof * lybs .position );
1322+ lybs .inner_chunks = malloc (LYB_STATE_STEP * sizeof * lybs .inner_chunks );
1323+ LY_CHECK_ERR_GOTO (!lybs .written || !lybs .position || !lybs .inner_chunks , LOGMEM (NULL ), finish );
1324+ lybs .used = 0 ;
1325+ lybs .size = LYB_STATE_STEP ;
1326+ lybs .models = NULL ;
1327+ lybs .mod_count = 0 ;
1328+ lybs .ctx = NULL ;
1329+
1330+ /* read magic number */
1331+ ret += (r = lyb_parse_magic_number (data , & lybs ));
1332+ LYB_HAVE_READ_GOTO (r , data , finish );
1333+
1334+ /* read header */
1335+ ret += (r = lyb_parse_header (data , & lybs ));
1336+ LYB_HAVE_READ_GOTO (r , data , finish );
1337+
1338+ /* read model count */
1339+ ret += (r = lyb_read_number ((uint64_t * )& lybs .mod_count , 2 , data , & lybs ));
1340+ LYB_HAVE_READ_GOTO (r , data , finish );
1341+
1342+ /* read all models */
1343+ for (i = 0 ; i < lybs .mod_count ; ++ i ) {
1344+ /* module name length */
1345+ len = 0 ;
1346+ ret += (r = lyb_read_number (& len , 2 , data , & lybs ));
1347+ LYB_HAVE_READ_GOTO (r , data , finish );
1348+
1349+ /* model name */
1350+ ret += (r = lyb_read (data , buf , len , & lybs ));
1351+ LYB_HAVE_READ_GOTO (r , data , finish );
1352+
1353+ /* revision */
1354+ ret += (r = lyb_read (data , buf , 2 , & lybs ));
1355+ LYB_HAVE_READ_GOTO (r , data , finish );
1356+ }
1357+
1358+ while (data [0 ]) {
1359+ /* register a new subtree */
1360+ ret += (r = lyb_read_start_subtree (data , & lybs ));
1361+ LYB_HAVE_READ_GOTO (r , data , finish );
1362+
1363+ /* skip it */
1364+ ret += (r = lyb_skip_subtree (data , & lybs ));
1365+ LYB_HAVE_READ_GOTO (r , data , finish );
1366+
1367+ /* subtree finished */
1368+ lyb_read_stop_subtree (& lybs );
1369+ }
1370+
1371+ /* read the last zero, parsing finished */
1372+ ++ ret ;
1373+
1374+ finish :
1375+ free (lybs .written );
1376+ free (lybs .position );
1377+ free (lybs .inner_chunks );
1378+ free (lybs .models );
1379+ return ret ;
1380+ }
0 commit comments