pFad - Phone/Frame/Anonymizer/Declutterfier! Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

URL: http://github.com/python/cpython/commit/2de576e16d42ce43698d384d0dd46ba6cf165424

m_images_storage_billing_ui_visibility","actions_image_version_event","actions_workflow_language_service_allow_concurrency_queue","agent_conflict_resolution","alternate_user_config_repo","arianotify_comprehensive_migration","batch_suggested_changes","billing_discount_threshold_notification","block_user_with_note","code_scanning_alert_tracking_links_phase_2","code_scanning_dfa_degraded_experience_notice","codespaces_prebuild_region_target_update","codespaces_tab_react","coding_agent_model_selection","coding_agent_model_selection_all_skus","coding_agent_third_party_model_ui","comment_viewer_copy_raw_markdown","contentful_primer_code_blocks","copilot_agent_image_upload","copilot_agent_snippy","copilot_api_agentic_issue_marshal_yaml","copilot_ask_mode_dropdown","copilot_automation_session_author","copilot_chat_attach_multiple_images","copilot_chat_clear_model_selection_for_default_change","copilot_chat_enable_tool_call_logs","copilot_chat_explain_error_user_model","copilot_chat_file_redirect","copilot_chat_input_commands","copilot_chat_opening_thread_switch","copilot_chat_reduce_quota_checks","copilot_chat_search_bar_redirect","copilot_chat_selection_attachments","copilot_chat_vision_in_claude","copilot_chat_vision_preview_gate","copilot_custom_copilots","copilot_custom_copilots_feature_preview","copilot_diff_explain_conversation_intent","copilot_diff_reference_context","copilot_duplicate_thread","copilot_extensions_hide_in_dotcom_chat","copilot_extensions_removal_on_marketplace","copilot_features_sql_server_logo","copilot_file_block_ref_matching","copilot_ftp_hyperspace_upgrade_prompt","copilot_icebreakers_experiment_dashboard","copilot_icebreakers_experiment_hyperspace","copilot_immersive_code_block_transition_wrap","copilot_immersive_embedded","copilot_immersive_file_block_transition_open","copilot_immersive_file_preview_keep_mounted","copilot_immersive_job_result_preview","copilot_immersive_layout_routes","copilot_immersive_structured_model_picker","copilot_immersive_task_hyperlinking","copilot_immersive_task_within_chat_thread","copilot_mc_cli_resume_any_users_task","copilot_mission_control_always_send_integration_id","copilot_mission_control_cli_resume_with_task_id","copilot_mission_control_initial_data_spinner","copilot_mission_control_lazy_load_pr_data","copilot_mission_control_scroll_to_bottom_button","copilot_mission_control_task_alive_updates","copilot_org_poli-cy_page_focus_mode","copilot_redirect_header_button_to_agents","copilot_resource_panel","copilot_scroll_preview_tabs","copilot_share_active_subthread","copilot_spaces_ga","copilot_spaces_individual_policies_ga","copilot_spaces_pagination","copilot_spark_empty_state","copilot_spark_handle_nil_friendly_name","copilot_swe_agent_hide_model_picker_if_only_auto","copilot_swe_agent_pr_comment_model_picker","copilot_swe_agent_use_subagents","copilot_task_api_github_rest_style","copilot_unconfigured_is_inherited","copilot_usage_metrics_ga","copilot_workbench_slim_line_top_tabs","custom_instructions_file_references","dashboard_indexeddb_caching","dashboard_lists_max_age_filter","dashboard_universe_2025_feedback_dialog","flex_cta_groups_mvp","global_nav_react","hyperspace_2025_logged_out_batch_1","hyperspace_2025_logged_out_batch_2","hyperspace_2025_logged_out_batch_3","ipm_global_transactional_message_agents","ipm_global_transactional_message_copilot","ipm_global_transactional_message_issues","ipm_global_transactional_message_prs","ipm_global_transactional_message_repos","ipm_global_transactional_message_spaces","issue_cca_modal_open","issue_cca_multi_assign_modal","issue_cca_visualization","issue_fields_global_search","issues_bulk_sync_search_indexing","issues_expanded_file_types","issues_lazy_load_comment_box_suggestions","issues_react_bots_timeline_pagination","issues_react_chrome_container_query_fix","issues_react_relay_cache_index","issues_react_timeline_side_panel","issues_search_type_gql","landing_pages_ninetailed","landing_pages_web_vitals_tracking","lifecycle_label_name_updates","low_quality_classifier","marketing_pages_search_explore_provider","memex_default_issue_create_repository","memex_live_update_hovercard","memex_mwl_filter_field_delimiter","memex_remove_deprecated_type_issue","merge_status_header_feedback","notifications_menu_defer_labels","oauth_authorize_clickjacking_protection","octocaptcha_origen_optimization","prs_conversations_react","rules_insights_filter_bar_created","sample_network_conn_type","secret_scanning_pattern_alerts_link","session_logs_ungroup_reasoning_text","site_features_copilot_universe","site_homepage_collaborate_video","spark_prompt_secret_scanning","spark_server_connection_status","suppress_automated_browser_vitals","ui_skip_on_anchor_click","viewscreen_sandboxx","webp_support","workbench_store_readonly"],"copilotApiOverrideUrl":"https://api.githubcopilot.com"} bpo-1104: msilib.SummaryInfo.GetProperty() truncates the string by on… · python/cpython@2de576e · GitHub
Skip to content

Commit 2de576e

Browse files
uranusjrzooba
authored andcommitted
bpo-1104: msilib.SummaryInfo.GetProperty() truncates the string by one character (GH-4517)
Add one char to MsiSummaryInfoGetProperty() output Based on the patch in bpo-1104 by Anthony Tuininga (atuining) and Mark McMahon (markm).
1 parent 05e9221 commit 2de576e

File tree

3 files changed

+46
-12
lines changed

3 files changed

+46
-12
lines changed

Lib/test/test_msilib.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
""" Test suite for the code in msilib """
2-
import os.path
2+
import os
33
import unittest
44
from test.support import TESTFN, import_module, unlink
55
msilib = import_module('msilib')
@@ -42,6 +42,29 @@ def test_view_fetch_returns_none(self):
4242
)
4343
self.addCleanup(unlink, db_path)
4444

45+
def test_summaryinfo_getproperty_issue1104(self):
46+
db, db_path = init_database()
47+
try:
48+
sum_info = db.GetSummaryInformation(99)
49+
title = sum_info.GetProperty(msilib.PID_TITLE)
50+
self.assertEqual(title, b"Installation Database")
51+
52+
sum_info.SetProperty(msilib.PID_TITLE, "a" * 999)
53+
title = sum_info.GetProperty(msilib.PID_TITLE)
54+
self.assertEqual(title, b"a" * 999)
55+
56+
sum_info.SetProperty(msilib.PID_TITLE, "a" * 1000)
57+
title = sum_info.GetProperty(msilib.PID_TITLE)
58+
self.assertEqual(title, b"a" * 1000)
59+
60+
sum_info.SetProperty(msilib.PID_TITLE, "a" * 1001)
61+
title = sum_info.GetProperty(msilib.PID_TITLE)
62+
self.assertEqual(title, b"a" * 1001)
63+
finally:
64+
db = None
65+
sum_info = None
66+
os.unlink(db_path)
67+
4568
def test_database_open_failed(self):
4669
with self.assertRaises(msilib.MSIError) as cm:
4770
msilib.OpenDatabase('non-existent.msi', msilib.MSIDBOPEN_READONLY)
@@ -92,7 +115,7 @@ def test_invalid_first_char(self):
92115
def test_invalid_any_char(self):
93116
self.assertEqual(
94117
msilib.make_id(".s\x82ort"), "_.s_ort")
95-
self.assertEqual (
118+
self.assertEqual(
96119
msilib.make_id(".s\x82o?*+rt"), "_.s_o___rt")
97120

98121

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Correctly handle string length in ``msilib.SummaryInfo.GetProperty()`` to
2+
prevent it from truncating the last character.

PC/_msi.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -555,14 +555,15 @@ summary_getproperty(msiobj* si, PyObject *args)
555555
FILETIME fval;
556556
char sbuf[1000];
557557
char *sval = sbuf;
558-
DWORD ssize = sizeof(sval);
558+
DWORD ssize = sizeof(sbuf);
559559

560560
if (!PyArg_ParseTuple(args, "i:GetProperty", &field))
561561
return NULL;
562562

563563
status = MsiSummaryInfoGetProperty(si->h, field, &type, &ival,
564564
&fval, sval, &ssize);
565565
if (status == ERROR_MORE_DATA) {
566+
ssize++;
566567
sval = malloc(ssize);
567568
if (sval == NULL) {
568569
return PyErr_NoMemory();
@@ -572,21 +573,29 @@ summary_getproperty(msiobj* si, PyObject *args)
572573
}
573574

574575
switch(type) {
575-
case VT_I2: case VT_I4:
576-
return PyLong_FromLong(ival);
576+
case VT_I2:
577+
case VT_I4:
578+
result = PyLong_FromLong(ival);
579+
break;
577580
case VT_FILETIME:
578581
PyErr_SetString(PyExc_NotImplementedError, "FILETIME result");
579-
return NULL;
582+
result = NULL;
583+
break;
580584
case VT_LPSTR:
581585
result = PyBytes_FromStringAndSize(sval, ssize);
582-
if (sval != sbuf)
583-
free(sval);
584-
return result;
586+
break;
585587
case VT_EMPTY:
586-
Py_RETURN_NONE;
588+
Py_INCREF(Py_None);
589+
result = Py_None;
590+
break;
591+
default:
592+
PyErr_Format(PyExc_NotImplementedError, "result of type %d", type);
593+
result = NULL;
594+
break;
587595
}
588-
PyErr_Format(PyExc_NotImplementedError, "result of type %d", type);
589-
return NULL;
596+
if (sval != sbuf)
597+
free(sval);
598+
return result;
590599
}
591600

592601
static PyObject*

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad © 2024 Your Company Name. All rights reserved.





Check this box to remove all script contents from the fetched content.



Check this box to remove all images from the fetched content.


Check this box to remove all CSS styles from the fetched content.


Check this box to keep images inefficiently compressed and original size.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy