static Dwarf * scngrp_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Dwarf_Cmd cmd, Elf_Scn *scngrp) { /* SCNGRP is the section descriptor for a section group which might contain debug sections. */ Elf_Data *data = elf_getdata (scngrp, NULL); if (data == NULL) { /* We cannot read the section content. Fail! */ free (result); return NULL; } /* The content of the section is a number of 32-bit words which represent section indices. The first word is a flag word. */ Elf32_Word *scnidx = (Elf32_Word *) data->d_buf; size_t cnt; for (cnt = 1; cnt * sizeof (Elf32_Word) <= data->d_size; ++cnt) { Elf_Scn *scn = elf_getscn (elf, scnidx[cnt]); if (scn == NULL) { /* A section group refers to a non-existing section. Should never happen. */ __libdw_seterrno (DWARF_E_INVALID_ELF); free (result); return NULL; } check_section (result, ehdr, scn, true); } return valid_p (result); }
/* Check scanned tokens for compliance with config file rules. Return zero * if config file complies, non-zero otherwise. Rules are: * * Global: * 1 - no keywords are allowed outside of a section * * Configuration sections: * 2 - may not contain number assignments * 3 - must contain certain keywords according to type (see keyword_table) * 4 - may not contain certain keywords according to type (see keyword_table) * 5 - keywords may be specified at most once * 6 - must contain at least one keyword assignment * 7 - section name must be unique in the configuration file * 8 - defaultboot:default must point to a valid section * * Menu sections: * 9 - must contain at least one number assignment * 10 - numbers in number assignment have to be unique in the section * 11 - referenced sections must be present * 12 - must contain certain keywords according to type (see keyword_table) * 13 - may not contain certain keywords according to type (see keyword_table) * 14 - keywords may be specified at most once * 15 - menu name must be unique in the configuration file * 16 - optional default position must be a valid position * */ int scan_check(struct scan_token* scan) { int i; int rc; i = 0; while (scan[i].id != scan_id_empty) { switch (scan[i].id) { case scan_id_section_heading: rc = check_section(scan, &i); if (rc) return rc; break; case scan_id_menu_heading: rc = check_menu(scan, &i); if (rc) return rc; break; default: /* Rule 1 */ error_reason("Line %d: %s not allowed outside of " "section", scan[i].line, scan_id_name(scan[i].id)); return -1; } } return 0; }
static Dwarf * global_read (Dwarf *result, Elf *elf, GElf_Ehdr *ehdr, Dwarf_Cmd cmd) { Elf_Scn *scn = NULL; while ((scn = elf_nextscn (elf, scn)) != NULL) check_section (result, ehdr, scn, false); return valid_p (result); }
int main(int argc, char **argv) { krb5_context context; krb5_error_code ret; krb5_config_section *tmp_cf; int optidx = 0; setprogname (argv[0]); ret = krb5_init_context(&context); if (ret == KRB5_CONFIG_BADFORMAT) errx (1, "krb5_init_context failed to parse configuration file"); else if (ret) errx (1, "krb5_init_context failed with %d", ret); if(getarg(args, sizeof(args) / sizeof(args[0]), argc, argv, &optidx)) usage(1); if (help_flag) usage (0); if(version_flag){ print_version(NULL); exit(0); } argc -= optidx; argv += optidx; tmp_cf = NULL; if(argc == 0) krb5_get_default_config_files(&argv); while(*argv) { ret = krb5_config_parse_file_multi(context, *argv, &tmp_cf); if (ret != 0) krb5_warn (context, ret, "krb5_config_parse_file"); argv++; } if(dumpconfig_flag) dumpconfig(0, tmp_cf); return check_section(context, "", tmp_cf, toplevel_sections); }
static int check_section(krb5_context context, const char *path, krb5_config_section *cf, struct entry *entries) { int error = 0; krb5_config_section *p; struct entry *e; char *local; for(p = cf; p != NULL; p = p->next) { local = NULL; if (asprintf(&local, "%s/%s", path, p->name) < 0 || local == NULL) errx(1, "out of memory"); for(e = entries; e->name != NULL; e++) { if(*e->name == '\0' || strcmp(e->name, p->name) == 0) { if(e->type != p->type) { krb5_warnx(context, "%s: unknown or wrong type", local); error |= 1; } else if(p->type == krb5_config_string && e->check_data != NULL) { error |= (*(check_func_t)e->check_data)(context, local, p->u.string); } else if(p->type == krb5_config_list && e->check_data != NULL) { error |= check_section(context, local, p->u.list, e->check_data); } if(e->deprecated) { krb5_warnx(context, "%s: is a deprecated entry", local); error |= 1; } break; } } if(e->name == NULL) { krb5_warnx(context, "%s: unknown entry", local); error |= 1; } free(local); } return error; }